Tag: UX

  • Adobe Anuncia Plataforma Aberta para Experience Design com o Adobe XD CC

    Adobe Anuncia Plataforma Aberta para Experience Design com o Adobe XD CC

    A Adobe anunciou que está abrindo uma plataforma para permitir que usuários, empresas e desenvolvedores criem ferramentas personalizadas para serem usadas com o ecossistema do Adobe XD.

    Já disponível para parceiros, a API do Adobe XD agora é aberta para que os desenvolvedores possa adicionar novas ferramentas, automatizar projetos e conectar a ferramentas e serviços comuns aos designers ou específicas para cada projeto.

    Junto a isso, o Adobe XD também agora apresenta integração com ambientes de colaboração populares como o Microsoft Teams, Slack e Jira Software Cloud.

    “Estamos compromissados como o desenvolvimento de um ecossistema ricos acerca do Adobe XD, para atender as necessidades do designer moderno. (…) Oferecer experiências de usuário atraentes e engajadas é imperativo para marcas, empresas e todos os produtos digitas, e a Adobe está focada em prover aos designers poderosos recursos de colaboração”

    Scott Belsky. Diretor de Produto e Vice-Presidente Executivo do Adobe Creative Cloud.

    A plataforma aberta estará disponível ainda em 2018, mas a Adobe já vem trabalhando para construir plugins com o XD com parceiros como a Microsoft, Trello, UserTesting, Airtable, Dribble, Sillicon Publishg, Slope, inMotionNow, Astute Graphics, Anima e Google Cloud, além de suas próprias ferramentas como o Behance e Adobe Stock.

    Fundo de 10 milhões de dólares para capacitação em inovação criativa

    A Adobe também revelou que seu fundo de incentivo ao design, Adobe Fund for Design, criado em Maio deste ano, distribuiu uma grande quantidade  de investimentos para desenvolvedores de UX em todo mundo. Os investimentos iniciais incluíram indivíduos e empresas, com diversos produtos disponíveis ainda este mês:

    • CloudApp – Video, webcam, captura de tela com anotação e criação de GIF através da nuvem.
    • Protoio, Inc., makers of Overflow – Capacita designers a projetar, apresentar e compartilhar bonitos diagramas de fluxo que contam uma história.
    • Stark – Ajuda seu projeto e a construir produtos que são acessíveis éticos e inclusivos.
    • Florian Schulz, Maker of Ratio – Criar ferramentas para integração de tipografia.
    • Precious Design Studio – Um estúdio que ajuda inovadores a modelarem produtos e serviços que as pessoas amem interagir, bem como ferramentas de design como Data Populator e Open Color Tools.
    • Odin Chart – Tyler Wolf é um designer de visualização de dados construtor do Odin Chart, uma ferramenta simples que cria gráficos para produtos digitais e publiccações.
    • Iconscout by Chamestudio – Ícones de alta qualidade, ilustrações e fotos stock em um único lugar.
    • Impekable – Agência digital especializada em experiência do usuário e desenvolvimento de softwares.
    • UI Faces – Avatares para maquetes (mockups) de design.
    • Prototypr.io – Comunide para designers que querem compartilhar seus trabalhos e ficarem atualizados com as últimas ferramentas e novidades sobre design.
    • Modulz – Gerador de código para construção de interfaces gráficas sem a necessidade de programar.
    • Design+Code – O time por traz dos populares cursos de código e dedsign e do plugin Angle.
    • Yummygum – Criar designs belos e experiencias refrescantes para web e mobile.

     

    A Adobe também anunciou algumas novidades para o Adobe XD, como facilidade nos workflows, para o processo designer-desenvolvedor e opções de extrair assets.

    O Adobe XD está disponível gratuitamente através do plano Start da Adobe ou através dos planos de aplicativo único ou do Adobe CC.

     

    Com informações do Abduzeedo e Adobe News

  • Como Selecionar o Item de Uma Tabela HTML

    Como Selecionar o Item de Uma Tabela HTML

    Uma dúvida foi postada no grupo de Design e Programação de nossa página, lá no Facebook, hoje. Essa pergunta era referente a como selecionar de uma linha de uma tabela HTML?

    Para tal, basta usar um pouco de Javascript e CSS.

    Montando a Tabela

    Vamos montar, para testar, uma tabela simples, respeitando a semântica HTML básica. Vamos aproveitar para colocar logo um botão, que vai ser por onde podemos visualizar os dados da linha selecionada:

    <table id='minhaTabela'>
         <thead>
              <tr>
                   <th>ID</th>
                   <th>Nome</th>
                   <th>Idade</th>
              <tr>
         </thead>
         <tbody>
              <tr>
                   <td>01</td>
                   <td>Rodrigo</td>
                   <td>33</td>
                   </tr>
              <tr>
                   <td>02</td>
                   <td>Taynara</td>
                   <td>21</td>
              </tr>
              <tr>
                   <td>03</td>
                   <td>Raveny</td>
                   <td>22</td>
              </tr>
              <tr>
                   <td>04</td>
                   <td>Sérgio</td>
                   <td>51</td>
              </tr>
              <tr>
                   <td>05</td>
                   <td>Alice</td>
                   <td>20</td>
              </tr>
         </tbody>
    </table>
    
    <button id="visualizarDados">Visualizar Dados</button>
    

    Agora precisamos incluir um estilo para que a tabela fique mais elegante.

    É importantíssimo prestar atenção ao class “selecionado” que vai ser a referência para o seu javascript saber qual linha está selecionada na tabela.

    #minhaTabela{
      width:80%;
      margin:0 auto;
      border:0;
      box-shadow: 0 5px 30px darkgrey;
      border-spacing: 0;
    }
    
    #minhaTabela thead th{
      font-weight: bold;
      background-color: black;
      color:white;
      
      padding:5px 10px;
    }
    
    #minhaTabela tr td{
      padding:5px 10px;
      text-align: center;
      
      cursor: pointer; /**importante para não mostrar cursor de texto**/
    }
    
    #minhaTabela tr td:last-child{
      text-align: right;
    }
    
    /**Cores**/
    #minhaTabela tr:nth-child(odd){
      background-color: #eee;
    }
    
    /**Cor quando passar por cima**/
    #minhaTabela tr:hover td{
      background-color: #feffb7;
    }
    
    /**Cor quando selecionado**/
    #minhaTabela tr.selecionado td{
      background-color: #aff7ff;
    }
    
    button#visualizarDados{
      background-color: white;
      border: 1px solid black;
      width:50%;
      margin: 10px auto;
      padding:10px 0;
      display: block;
      color: black;
    }
    

    Javascript

    Para sermos mais justos, vamos fazer o exemplo usando Javascript puro. No nosso exemplo, vamos contemplar a opção de selecionar uma única linha ou mais de uma linha, opção determinada apenas por um parâmetro. Ainda vamos ver como manipular os dados.

    Inicialmente, precisamos capturar a tabela e adicionar, à ação de clique, uma função que adicione ou remova a classe de seleção:

    var tabela = document.getElementById("minhaTabela");
    var linhas = tabela.getElementsByTagName("tr");
    
    for(var i = 0; i < linhas.length; i++){
    	var linha = linhas[i];
      linha.addEventListener("click", function(){
      	//Adicionar ao atual
    		selLinha(this, false); //Selecione apenas um
                    //selLinha(this, true); //Selecione quantos quiser
    	});
    }
    

    A função selLinha() vai ser responsável por adicionar ou remover a class “selecionado” do nó. Passamos também um parâmetro que vai determinar se poderá selecionar mais que uma linha ou apenas uma. O primeiro laço, caso múltiplos seja falso, irá apenas desmarcar todos as linhas antes de marcar a linha clicada.

    /**
    Caso passe true, você pode selecionar multiplas linhas.
    Caso passe false, você só pode selecionar uma linha por vez.
    **/
    function selLinha(linha, multiplos){
      if(!multiplos){
      	var linhas = linha.parentElement.getElementsByTagName("tr");
            for(var i = 0; i < linhas.length; i++){
               var linha_ = linhas[i];
               linha_.classList.remove("selecionado");    
            }
      }
      linha.classList.toggle("selecionado");
    }
    

    Agora vamos adicionar uma função ao clique do botão para que a gente possa visualizar os dados selecionados. Para isso, iremos justamente capturar apenas as linhas que tiverem a class “selecionado” e, através de um laço, vamos concatenar os valores dentro dos nós <td> da(s) linha(s) selecionada(s).

    /**
    Exemplo de como capturar os dados
    **/
    var btnVisualizar = document.getElementById("visualizarDados");
    
    btnVisualizar.addEventListener("click", function(){
    	var selecionados = tabela.getElementsByClassName("selecionado");
      //Verificar se eestá selecionado
      if(selecionados.length < 1){
      	alert("Selecione pelo menos uma linha");
        return false;
      }
      
      var dados = "";
      
      for(var i = 0; i < selecionados.length; i++){
      	var selecionado = selecionados[i];
        selecionado = selecionado.getElementsByTagName("td");
        dados += "ID: " + selecionado[0].innerHTML + " - Nome: " + selecionado[1].innerHTML + " - Idade: " + selecionado[2].innerHTML + "\n";
      }
      
      alert(dados);
    });
    

    Vamos Testar?

    ID Nome Idade
    01 Rodrigo 33
    02 Taynara 21
    03 Raveny 22
    04 Sérgio 51
    05 Alice 20

    No entanto, se você preferir ver todo código completo, acesse o JsFiddle incorporado abaixo:


    Gostou do post curtinho? Tem dúvidas? Deixe seu comentário e compartilhe com quem você achar que vai gostar. Aproveite para entrar no nosso grupo de Design e Programação no Facebook ou em nossa página. Acompanhe-nos no Twitter e Instagram.

  • Adobe apresenta solução para criação de objetos em Realidade Aumentada

    Adobe apresenta solução para criação de objetos em Realidade Aumentada

    Na última WWDC, a Adobe apresentou uma solução de RA (Realidade Aumentada) que visa facilitar a produção de conteúdo para esse segmento. Nomeada de Adobe Aero, essa solução consiste em um conjunto de ações, complementos e aplicativos para agilizar o desenvolvimento de objetos 3D para realidade aumentada, tanto para design quanto para criação de aplicativos.

    Em colaboração com a Apple e a Pixar, a Adobe também anunciou o suporte de USDZ (Universal Scene Description -Zipped) para o Adobe Creative Cloud. Designers podem criar e editar seus objetos em ferramentas como o Photoshop CC e Dimension CC, para então exportar nativamente para o USDZ que pode ser consumido pelo ecossistema da Apple.

    O Project Aero consiste em desenvolver soluções para serem usadas com o ARKit da Apple e vinculando ao Xcode para refinamento e o uso no desenvolvimento.

    Exemplos do uso das novas funcionalidades da Adobe poderão ser vistos no Festival do Impossível, que vai acontecer no começo de Junho em São Francisco.

    Caso você seja desenvolvedor ou designer e tenha interesse em experimentar o Projeto Aero, estão abertas inscrições para acesso antecipado através do site da própria Adobe. Vale ressaltar que precisa possuir um iPhone 6S ou mais recente para usar a solução.

    Mais informações surgirão na Adobe MAX, durante o outono americano.

  • CSS – Como usar transition com display:block?

    CSS – Como usar transition com display:block?

    Todos sabemos que transições são importantes para diminuir a sensação de repentinidade para o usuário e preparar o cérebro para, aos poucos, compreender a nova informação.

    Porém, o  transition do CSS3 não funciona uniformemente com todos os parâmetros. Quem nunca quis que um elemento HTML em tela sumisse aos poucos?

    O mais comum é utilizar o bom e velho display: none;, porém este simplesmente não funciona ao aplicar um transition. Usemos a lógica de que a passagem de um bloco para um nada não é uma transição. No CSS, uma transição inicialmente precisa ser um comando baseado em números.

    Como usar o CSS para fazer a transição de um objeto sumir?

    Para realizar esta ação, vamos usar um pequeno truque. Ao invés de simplesmente não mostrar o objeto, vamos desativar sua propriedade de ser manipulável com o mouse ou toque. Para isso podemos usar a propriedade pointer-events, ficando:

    div{
        opacity: 1;
        transition: opacity .5s linear;
    }
    
    div.hide{
        opacity: 0;
        pointer-events: none;
    }

    Para fazer o objeto desaparecer vamos usar um pouco de JavaScript apenas para adicionar ou remover a classe CSS da div:

    function ocultar(){
        var element = document.getElementById("idDaDiv");
              element.classList.add("hide");
    }
    function mostrar(){
        var element = document.getElementById("idDaDiv");
              element.classList.remove("hide");
    }

    Vamos testar?

    Mas e se você quiser que ele também não ocupe um espaço? Pois pode ficar um buraco perturbador. Nesse caso você pode modificar a altura do elemento para poder aproveitar melhor esse espaço. Todavia, a propriedade height não é animável (talvez por possuir uma propriedade auto). Para esse caso, você precisa usar o max-height para realizar esta animação.

    div {
      overflow:hidden;
      max-height: 200px;
      transition: max-height 1s ease-in-out;
    }
    
    div.hide {
      max-height: 0;
      pointer-events: none;
    }

    Lembre-se que para evitar que o conteúdo seja mostrado independente da div que você vai aplicar a transição, será necessário colocar a propriedade overflow como hidden. Também é importante salientar que a propriedade max-height só é animável caso você use as medidas fixas em pixels. Como ele determina apenas o tamanho máximo, não vai influenciar se você colocar um tamanho maior que o esperado, o que se torna funcional também para responsividade.

    Vamos Testar?

    Se acredita que essa dica de CSS é útil para mais alguém, compartilhe e curta esta página!

  • Redesign do Snapchat é Recebido de Forma Negativa pelos usuários

    Redesign do Snapchat é Recebido de Forma Negativa pelos usuários

    No final de 2017, o Snapchat apresentou um novo design para sua aplicação. O foco então foi criar uma separação entre a mídia e o social, deixando os amigos, criadores de conteúdo e anunciantes em áreas separadas. As mudanças também retiraram alguns filtros e adicionou alguns comportamentos diferentes na ferramenta, como um mapa para localização de amigos. O novo modelo de Descoberta mostra uma estrutura similar a um feed, que mostra novidades em ordem de interesse, calculado por um algorítmo.

    O caso é que o resultado não foi bem recebido pelos usuários. A AppStore mostrou que as reviews dos usuários em países como Canadá, Reino Unido e Austrália se tornaram extremamente negativas em 83%. Usuários demonstraram descontentamento como a nova interface e conceito aplicado, também em outras mídias sociais. Apenas 17% deram 3 estrelas ou mais.

    Segundo notícias, o Snapchat teria feito as modificações com o objetivo de otimizar seus anúncios. As mudanças no design teriam sido feitas então para tentar incentivar os usuários a postarem no Stories, visto que enquanto houve crescimento no uso do chat, nos posts públicos não houve o mesmo retorno.

    Envio de Stories se mantém iguais nos últimos meses.
    Envio de Snaps privados crescem
    Envio de Snaps privados crescem

    Essas decisões de redesign, segundo usuários, resultaram em dificuldades para encontrar o que eles já achavam mais rapidamente e não obteve sucesso em trazer novos usuários.

    Com notícias do Techcrunch, The Verge e Busines Insider

  • IBM Watson – Como Criar um Chatbot (com PHP e jQuery)

    IBM Watson – Como Criar um Chatbot (com PHP e jQuery)

    Inteligência artificial é um tema que está em discussão constante no novo milênio. O uso de chatbots tem sido cada vez mais utilizado em diversos ambientes, seja para atendimento, monitoramento, suporte ou outras aplicações diversas. Designers de Interação e Programadores tem usado cada vez mais essas tecnologias para poder criar uma experiência melhor e mais dinâmica para o usuário.

    Dentro da área da computação cognitiva, uma das empresas que está em muita evidência no mercado é a IBM, com sua tecnologia Watson.

    A tecnologia Watson é uma amálgama de serviços de inteligência artificial que permite ao desenvolvedor criar plataformas de comunicação automatas com seus usuários. Para isso, a IBM disponibiliza diversas APIs de comunicação com determinados serviços. Para nosso exemplo de chatbot usaremos o serviço de Conversação do Watson.

    Criar um chatbot com o Watson é bem mais simples do que parece. Porém, devemos deixar claro que a proposta deste tutorial é ser básico, ser um ambiente de entrada, simplificado porém funcional para o desenvolvedor ou designer interessado nesse tipo de tecnologia.

    Atenção, você precisa de um servidor que possa ser autenticado na internet. Ou seja, não adianta testar de Xampp ou Wampp, você precisa testar ao menos de uma hospedagem compartilhada.

    Preparando o Ambiente

    Primeiramente você vai precisar de uma conta na Bluemix. A Bluemix é uma plataforma em nuvem de projetos da Big Blue (apelido dado a IBM pelo mercado). Para isso, basta entrar no site da empresa e clicar em Teste Gratuito 30 Dias.

    Depois disso, siga as instruções para você preencher os seus dados básicos.

    Após o preenchimento de seus dados, será pedido para você criar uma organização. Por algum motivo, você não verá a opção de América do Sul referente ao local, todavia você pode continuar selecionando SUL DOS EUA que não vai impedir o funcionamento do chatbot. Simplesmente siga as demais opções até chegar ao final.

    Cadastro no Bluemix

    Assim que você finalizar, é possível ver uma área para criar Apps. Por hora você pode ignorar completamente isso. À primeira vista, o Bluemix parece ser um pouco difícil de navegar e encontrar algo por conta da diversidade de opções e APIs disponíveis.

    No canto superior esquerdo você vai ver um menu hambúrguer. Clique nesse menu e selecione a opção Serviços. Lá, você vai ver a opção Watson.

    Como nosso tutorial é sobre chatbot, devemos criar um serviço do tipo Conversação. Clique no botão Criar serviço Watson e, na página que se abrirá, selecione a opção Conversation. A configuração do serviço é bem similar ao cadastro do próprio Bluemix.

    Criar serviço de conversação Watson

    Configuração Bluemix

    Esse serviço possui versões Lite (que é gratuita), Padrão e Premium (que precisa de consulta). Na versão Lite, que estamos usando para este tutorial, você possui até 10 mil requisições por mês e não poderá salvar os logs dos chats. Porém a versão padrão não é cara, cada requisição é uma fração inferior a metade de um centavo, o que é um valor aceitável para um sistema corporativo.

    Preço Conversação Watson

    Agora é necessário “ensinar” ao Watson o que você quer que ele responda. Apesar dele já possuir uma inteligência base interna, que reconhece erros e contextos, você precisa treina-lo para que ele dê as respostas corretas para determinadas perguntas.

    Para iniciar, você precisa criar um novo Workspace (por enquanto, pode ignorar o espaço de trabalho de exemplo).

    Criar espaço de trabalho

    Atenção ao idioma do espaço de trabalho que você está criando.

    Treinando o Watson

    Uma vez criado o espaço de trabalho (Workspace), iniciaremos o processo de treinamento do Watson. Para isso, você deve primeiro criar um intent. Um intent é uma intenção de comunicação, ou seja, é um conjunto de interações padronizadas que o usuário poderá fazer com o chatbot.

    Cada intenção que for criada precisa ter pelo menos 5 exemplos de interações para poder funcionar. A partir daí o Watson também irá entender perguntas similares. Não é necessário se preocupar com muitas variações. A tecnologia é inteligente o suficiente para trabalhar com diferenças básicas, erros de digitação e compreender contextos. Em nosso exemplo, vamos criar uma intenção com o nome de #Saudações e preencher com algumas interações básicas de saudações.

    Uma vez criada as intenções desejadas (em nosso exemplo criamos apenas uma), você deverá criar as possíveis respostas para essas intenções e suas variações. Para isso, você deve ir na área de Dialog.

    Um diálogo (Dialog), como o nome já diz, consiste em um conjunto de interações e condições dessas interações, com uma resposta, que pode ou não resultar em um feedback para encerrar um processo de comunicação.

    No Watson, o diálogo é organizado em um sistema de árvores, que possui uma lógica de nós e subnós. Para nosso exemplo, vamos criar um novo nó para responder a intenção de saudação que criamos anteriormente. Clique em Add node.

    Após dar um nome ao nó, você deve colocar o que o bot irá reconhecer. A intenção é representada pelo símbolo de hash (#). Então, basicamente diz: Se o bot reconhecer a intenção #Saudação, então responda com:

    Você pode colocar quantas respostas você quiser. Quanto mais respostas você colocar, maior a quantidade de diálogo possível, deixando o ambiente de comunicação mais natural e otimizando o aprendizado.

    Como opções adicionais você pode colocar as respostas em forma sequencial ou aleatória. Ainda é possível criar condições específicas de contextos ou aguardar por respostas específicas à retóricas do chatbot.

    Com tudo isso preenchido, você já pode testar o chatbot. O próprio ambiente do bluemix possui uma área para testes. Clique no ícone com o balãozinho no canto superior direito e experimente o diálogo que você acabou de criar.

    Implementando o Back-end

    A API do Bluemix funciona através de comunicação cURL Essa comunicação é feita a partir de envios de informações via método POST e mediante autorização de acesso. Por isso, vamos precisar de algumas informações básicas do serviço de comunicação que criamos.

    Caso você queira ver outros exemplos que usam cURL, acesse nosso tutorial sobre preenchimento automático de formulário com o CNPJ ou o tutorial sobre preenchimento automático de endereço a partir do CEP.

    Então, antes de criamos o código, você vai precisar das seguintes informações:

    • Workspace ID
    • Username
    • Password

    O Workspace ID pode ser adquirido lá naquela tela de criação/seleção de ambientes de trabalho (Workspaces). Basta clicar no botão de menu, no canto superior direito do cartão referente ao workspace que criamos, em seguida clicando em View Details.

    Pegar Código do Workspace no Watson

    Para conseguir o login e senha do serviço de conversação, volte a tela onde você cria os serviços e vá na opção Credenciais de Serviço. Nessa área você pode visualizar ou criar novas credenciais, conseguindo assim o username e password que vamos precisar mais adiante.

    ATENÇÃO
    A IBM mudou a forma de autenticação. Agora, ao invés de você ter acesso ao username e password, as novas conexões usarão a autenticação AIM e não mais a autenticação por username  password. Mais detalhes, veja a documentação: https://console.bluemix.net/apidocs/assistant.

    Agora vamos ao código.

    A API REST do Watson, como dito acima, funciona a partir de comunicação cURL e vai retornar um json completo com todas as informações para a comunicação. Para criarmos uma conversa simples, precisamos definir o código. Fique atento ao que precisa ser preenchido.

    Exemplo usando PHP

    conversa.php

    Como o retorno é json, precisamos definir a página como text/plain, para evitar qualquer renderização incorreta.

    header("Content-Type: text/plain");

    Iremos definir então as informações que pegamos acima através das configurações do serviço de conversação. Lembre-se de substituir o código abaixo por seus dados.

    $workspace = "d5b7e381-xxxx-xxxx-xxxx-xxxxxxxxxxxx";
    
    $apikey = "xxxxxxxxxxxxxxxxx";
    
    /*Antiga autenticação
    $username = "cd27b34f-xxxx-xxxx-xxxx-xxxxxxxxxxxx";
    $password = "Klxxxxxxxx";
    */

    Precisamos agora capturar o texto que será enviado para o servidor do Watson. Para testes usaremos o $_REQUEST, do PHP. Por segurança, quando for trabalhar em modo de produção, troque para $_POST.

    $texto = $_REQUEST["texto"];

    Agora é necessário definir um identificador. Para manter o contexto de conversa, e o Watson saber que está conversando ainda com a mesma pessoa, é necessário passar um identificador. Esse identificador deverá ser único por conversa. Caso você esteja implementando em um sistema de gestão, por exemplo, você pode usar o nome de usuário, id, e-mail, ou algum outro tipo de identificação única.

    No nosso teste criaremos uma hash única md5 e a armazenaremos em uma sessão. Dessa forma, garantimos a criação temporária de um identificador único funcional. Nosso bloco então ficará:

    if (session_status() == PHP_SESSION_NONE) {
        session_start();
    }
    if(isset($_SESSION["identificador"])){
    	$identificador = $_SESSION["identificador"];
    }else{
    	$identificador = md5(uniqid(rand(), true));
    	$_SESSION["identificador"] = $identificador;
    }

    A URL da API REST deverá ser concatenada com o Workspace e o método que você está chamando. Dentro do gateway de conversação há vários métodos, desde status a tratamento de workspaces e diálogos. Através da documentação, você poderá explorar todos os métodos acessíveis para o Watson: https://www.ibm.com/watson/developercloud/conversation/api/v1/.

    Em nosso exemplo básico, entretanto, iremos utilizar apenas o método message. É importante lembrar que é necessário adicionar a data da versão da API como parâmetro para que possa funcionar.

    $url = "https://gateway.watsonplatform.net/conversation/api/v1/workspaces/" . $workspace;
    $urlMessage = $url . "/message?version=2017-05-26";

    Para enviar os dados para o Watson, precisamos criar uma pequena string json. Como em nosso exemplo só precisamos enviar o texto e o identificador, podemos simplesmente concatenar o texto, deixando-o pronto para envio.

    $dados  = "{";
    $dados .= "\"input\": ";
    $dados .= "{\"text\": \"" . $texto . "\"},";
    $dados .= "\"context\": {\"conversation_id\": \"" . $identificador . "\",";
    $dados .= "\"system\": {\"dialog_stack\":[{\"dialog_node\":\"root\"}], \"dialog_turn_counter\": 1, \"dialog_request_counter\": 1}}";
    $dados .= "}";

    Como estamos tratando de json, devemos especificar o cabeçalho do tipo de dados que estamos enviando.

    $headers = array('Content-Type:application/json');

    Agora começa a comunicação. Para acessar a API, algumas exigências são feitas. É necessário ser enviado em método POST um json e ser uma comunicação segura, com identificação de usuário e senha. O bloco referente a comunicação ficará então:

    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $urlMessage);
    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $dados);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    //curl_setopt($ch, CURLOPT_USERPWD, "$username:$password"); Autenticação antiga
    curl_setopt($ch, CURLOPT_USERPWD, "apikey:$apikey")
    curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
    $retorno = curl_exec($ch);
    curl_close($ch);

    Por fim, para facilitar a leitura, vamos imprimir o json na tela com uma organização mais legível para um ser-humano.

    $retorno = json_decode($retorno);
    echo json_encode($retorno, JSON_PRETTY_PRINT);

    Com isso já poderemos ter uma resposta json, que, ao passar o texto, retornará algo similar como na imagem abaixo:

    O código back-end completo fica (com comentários para ajudar a compreensão):

    <?php
    //Garantir que seja lido sem problemas
    header("Content-Type: text/plain");
    
    //Worskspace
    $workspace = "d5b7e381-XXXX-XXXX-XXXX-XXXXXXXXXXXX";
    
    /**
    Antiga Autenticação
    //Dados de Login
    $username = "cd27b34f-XXXX-XXXX-XXXX-XXXXXXXXXXXX";
    $password = "Kl8XXXXXXXXX";
    **/
    $apikey = "xxxxxxxxxxxxxxxxx";
    //Capturar Texto
    //Use $_POST em produção, por segurança
    $texto = $_REQUEST["texto"];
    
    //Verifica se existe identificador
    //Caso não haja, crie um
    if (session_status() == PHP_SESSION_NONE) {
        session_start();
    }
    if(isset($_SESSION["identificador"])){
    	$identificador = $_SESSION["identificador"];
    }else{
    	//Você pode usar qualquer identificador
    	//Você pode usar ID do usuário ou similar
    	$identificador = md5(uniqid(rand(), true));
    	$_SESSION["identificador"] = $identificador;
    }
    
    //URL da API
    //(deve ser passado o método e a versão da API em GET)
    $url = "https://gateway.watsonplatform.net/conversation/api/v1/workspaces/" . $workspace;
    $urlMessage = $url . "/message?version=2017-05-26";
    
    //Dados
    $dados  = "{";
    $dados .= "\"input\": ";
    $dados .= "{\"text\": \"" . $texto . "\"},";
    $dados .= "\"context\": {\"conversation_id\": \"" . $identificador . "\",";
    $dados .= "\"system\": {\"dialog_stack\":[{\"dialog_node\":\"root\"}], \"dialog_turn_counter\": 1, \"dialog_request_counter\": 1}}";
    $dados .= "}";
    
    //Cabeçalho que leva tipo de Dados
    $headers = array('Content-Type:application/json');
    
    //Iniciando Comunicação cURL
    $ch = curl_init();
    //Selecionando URL
    curl_setopt($ch, CURLOPT_URL, $urlMessage);
    //O cabeçalho é importante para definir tipo de arquivo enviado
    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
    //Habilitar método POST
    curl_setopt($ch, CURLOPT_POST, 1);
    //Enviar os dados
    curl_setopt($ch, CURLOPT_POSTFIELDS, $dados);
    //Capturar Retorno
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    //Autenticação
    //curl_setopt($ch, CURLOPT_USERPWD, "$username:$password"); Autenticação antiga
    curl_setopt($ch, CURLOPT_USERPWD, "apikey:$apikey")
    curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
    //Executar
    $retorno = curl_exec($ch);
    //Fechar Conexão
    curl_close($ch);
    
    //Imprimir com leitura fácil para humanos
    $retorno = json_decode($retorno);
    echo json_encode($retorno, JSON_PRETTY_PRINT);
    
    ?>

    Código do Front-End

    Agora precisamos fazer a interação do usuário com o chatbot. Para isso, precisamos criar uma área do chat e o formulário que enviará os dados.

    <div id="watson" class="watson">
    	<div class="mensagens">
    		<div class="area" id="chat">
    		</div>
    	</div>
    	<form id="mensagem" class="mensagem">
    		<input type="text" id="texto" name="texto" placeholder="Digite sua mensagem"/>
    		<button type="submit">Enviar</button>
    	</form>
    </div>

    Com a área de chat criada, está na hora de adicionarmos os scripts necessários para fazer a comunicação com o back-end. Para facilitar, usaremos o método ajax do jQuery. Atenção aos comentários no código abaixo, pois eles explicam para quê serve cada linha.

    <!--Importar jQuery. Retire caso sua página já faça a importação. -->
    <script type="text/javascript" src="https://code.jquery.com/jquery-3.2.1.min.js"></script>
    <script type="text/javascript">
    //Submeter Formulário
    $("#mensagem").submit(function(){
    	//Caso o usuário envie uma mensagem vazia
    	if($("#mensagem #texto").val() === ""){
    		//Adiciona na área de Chat a mensagem enviada pelo usuário
    		$("#chat").append("<div class=\"texto usuario\">...</div>");
    		
    		//Faz um scroll para a mensagem mais recente, caso necessário
    		$(".mensagens").animate({scrollTop: $("#chat").height()});
    		setTimeout(function(){
    			//Adiciona uma resposta padrão afirmando que o usuário deixou o campo vazio
    			$("#chat").append("<div class=\"texto chatbot\">Você precisa digitar alguma coisa para prosseguir.</div>");
    			//Faz um scroll para a mensagem mais recente, caso necessário
    			$(".mensagens").animate({scrollTop: $("#chat").height()});
    		},1000);
    		return false;
    	}
    	
    	//Inicia método AJAX
    	$.ajax({
    		//Substitua o caminho da URL pelo que você salvou o arquivo de backend
    		url: "/pasta/conversa.php?texto=" + $("#mensagem #texto").val(),
    		dataType: 'json', // Determina o tipo de retorno
    		beforeSend: function(){
    			//Adiciona a mensagem de usuário à lista de mensagens.
    			$("#chat").append("<div class=\"texto usuario\">" + $("#mensagem #texto").val() + "</div>");	
    		},
    		success: function(resposta){
    			//Limpa o que o usuário digitou e foca no input para próxima interação.
    			$("#mensagem #texto").val("");
    			$("#mensagem #texto").focus();
    			
    			//Caso haja um erro, o Watson retornará a mensagem de erro ao usuário
    			//Basta ler o objeto error para o usuário.
    			if(resposta.error){
    				$("#chat").append("<div class=\"texto chatbot\">" + resposta.error + "</div>");
    				return false;
    			}
    			
    			//Colocar a resposta do Watson para o usuário ler
    			//A mensagem de texto pode ser lida a partir da lógica
    			//do json de exemplo da imagem no post
    			var mensagemChatbot  = "<div class=\"texto chatbot\">";
    			mensagemChatbot		+= resposta.output.text[0];
    			mensagemChatbot		+= "</div>";
    			setTimeout(function(){
    				$("#chat").append(mensagemChatbot);
    				$(".mensagens").animate({scrollTop: $("#chat").height()});
    			},1000);
    		}
    	});
    
    	return false;
    });
    </script>

    Observe que no código acima existe um método setTimeOut que ocorre sempre antes de adicionar a resposta do Watson. Isso é feito por uma decisão de experiência do usuário.

    Uma resposta muito rápida pode causar uma confusão de interpretação e estranhamento.

    Quando você está conversando com alguém, a tendência é, ao enviar uma mensagem, esperar que a pessoa ao menos pense na resposta e digite antes de responder. Um pequeno atraso de um segundo na resposta é um tempo mínimo esperado para dar uma maior naturalidade a conversa e ainda permitir que o usuário se prepare para receber uma mensagem. Essa é uma decisão puramente de UX. Caso queira, você pode retirar o setTimeout e irá funcionar normalmente, mas ao testar você poderá sentir que esse tempo de resposta faz falta.

    Para finalizar, vamos colocar um estilo CSS para ficar mais agradável ao usuário.

    <style>
    	.watson{
    		border: 1px solid #B0BEC5;
    		border-radius: 3px;
    		height: 50em;
    		max-height: 500px;
    		padding: 1em;
    		
    		max-width: 500px;
    		margin: 0 auto;
    		
    		display: flex;
    		flex-direction: column;
    		justify-content: space-between;
    	}
    	
    	.watson .mensagens{
    		box-sizing: border-box;
    		overflow: hidden;
    		overflow-y: auto;
    		height: 100%;
    	}
    	
    	.watson .mensagens .area{
    		display: flex;
    		justify-content: flex-end;
    		flex-direction: column;
    		min-height: 100%;
    	}
    	
    	.watson .mensagens .texto{
    		border-radius: 2px;
    		box-sizing: border-box;
    		padding: .65em;
    		margin-top: .5em;
    		
    		animation: popupmensagem linear .2s;
    		animation-iteration-count: 1;
    		-webkit-animation: popupmensagem linear .2s;
    		-webkit-animation-iteration-count: 1;
    		-moz-animation: popupmensagem linear .2s;
    		-moz-animation-iteration-count: 1;
    		-o-animation: popupmensagem linear .2s;
    		-o-animation-iteration-count: 1;
    		-ms-animation: popupmensagem linear .2s;
    		-ms-animation-iteration-count: 1;
    	}
    	
    	.watson .mensagens .texto:first-child{
    		margin-top: 0;
    	}
    	
    	.watson .mensagens .texto.usuario{
    		background-color: #ECEFF1;
    		color: #1A237E;
    		margin-right: 30%;
    		
    		transform-origin: 0% 100%;
    		-webkit-transform-origin: 0% 100%;
    		-moz-transform-origin: 0% 100%;
    		-o-transform-origin: 0% 100%;
    		-ms-transform-origin: 0% 100%;
    	}
    	
    	.watson .mensagens .texto.chatbot{
    		background-color: #FF5722;
    		color: white;
    		font-weight: bold;
    		margin-left: 30%;
    		
    		transform-origin: 100% 100%;
    		-webkit-transform-origin: 100% 100%;
    		-moz-transform-origin: 100% 100%;
    		-o-transform-origin: 100% 100%;
    		-ms-transform-origin: 100% 100%;
    	}
    	
    	.watson form.mensagem{
    		padding: 0;
    		margin-top: 1em;
    	}
    	
    	.watson form.mensagem input{
    		border: 2px solid #476A7B;
    		border-radius: 3px;
    		padding: .5em .8em;
    		font-size: 16px;
    		display: block;
    		box-sizing: border-box;
    		width: 100%;
    	}
    	
    	.watson form.mensagem input:focus{
    		border: 2px solid #1A237E;
    		outline: none;
    	}
    	
    	.watson form.mensagem button{
    		background-color: #3F51B5;
    		border: none;
    		border-radius: 3px;
    		display: block;
    		padding: .5em 1em;
    		width: 100%;
    		font-size: 16px;
    		color: white;
    		margin-top: .5em;
    	}
    	
    	
    	/**Animação de Mensagem**/
    	
    	@keyframes popupmensagem{
    	  0% {
    		transform:  scaleX(0.30) scaleY(0.30) ;
    	  }
    	  100% {
    		transform:  scaleX(1.00) scaleY(1.00) ;
    	  }
    	}
    
    	@-moz-keyframes popupmensagem{
    	  0% {
    		-moz-transform:  scaleX(0.30) scaleY(0.30) ;
    	  }
    	  100% {
    		-moz-transform:  scaleX(1.00) scaleY(1.00) ;
    	  }
    	}
    
    	@-webkit-keyframes popupmensagem {
    	  0% {
    		-webkit-transform:  scaleX(0.30) scaleY(0.30) ;
    	  }
    	  100% {
    		-webkit-transform:  scaleX(1.00) scaleY(1.00) ;
    	  }
    	}
    
    	@-o-keyframes popupmensagem {
    	  0% {
    		-o-transform:  scaleX(0.30) scaleY(0.30) ;
    	  }
    	  100% {
    		-o-transform:  scaleX(1.00) scaleY(1.00) ;
    	  }
    	}
    
    	@-ms-keyframes popupmensagem {
    	  0% {
    		-ms-transform:  scaleX(0.30) scaleY(0.30) ;
    	  }
    	  100% {
    		-ms-transform:  scaleX(1.00) scaleY(1.00) ;
    	  }
    	}
    </style>
    

    E agora? Funciona mesmo?

    Veja o exemplo abaixo, utilizamos exatamente o mesmo código. Lembre-se que há apenas poucas interações e respostas criadas para este tutorial, então não espere ter uma conversa muito avançada com este chatbot.

    Obs. Está sendo utilizada no exemplo uma conta Lite, então é possível que quando você testar já tenha acabado o limite mensal.

    Caso você deseje um pouco mais de segurança, recomendamos que você utilize um arquivo .htdocs na pasta em que está o conversa.php, com o conteúdo abaixo. Evitando, assim, acesso externo.

    #Evitar Acesso Externo
    Order Deny,Allow
    Deny from all
    Allow from 127.           # localhost

    Faça o Download do Código no Github, se preferir:



    Download
    Implementar um chatbot do IBM Watson é mais simples do que você pensava, não é? Mas lembre-se que esse é só um tutorial básico para demonstrar como usar a API REST. Você pode, verificar todos os métodos e parâmetros que podem ser utilizados diretamente pela documentação.

    Caso tenha apreciado este conteúdo, dê uma passada lá na página da VelhoBit no Facebook e deixe seu like. Compartilhe este post com colegas e interessados na área de tecnologia e não deixe de conferir o restante dos artigos no blog.

    Até o próximo tutorial.

  • Experimentando o Adobe XD

    Experimentando o Adobe XD

     

    A Adobe lançou o preview do Experience Design. Trata-se de uma aplicação para que designers de interação possam criar leiautes e protótipos para webapps e aplicativos mobile. Atualmente a versão preview está disponível apenas para MacOSX, porém foi prometido uma versão para Windows até o final do ano (2016). No site da Adobe você poderá se cadastrar para pegar o preview para Windows assim que sair. Vale lembrar que você precisa ter uma conta válida da Adobe para poder usufruir do aplicativo.

    Uma informação interessante é que o responsável pelo projeto é o brasileiro, Demian Borba, famoso no Brasil por trazer o Adobe e o FlashCamp, além de ter sido representante principal do BlackBerry há alguns anos. O Demian Borba sempre foi envolvido com design de interação, desde a época do desenvolvimento de RIAs com o Flex.