Arquivos da categoria: Golang

Golang – GoDiffExporter – Exporte seus DIFFs com este utilitário

Olá,

Recentemente precisei compartilhar o resultado de um DIFF (git diff) para uma outra pessoa fazer a conferência e com isso eu precisava passar o acesso ao bitbucket e o link do commit específico para a conferência.

Isso me gerava um certo trabalho que eu não gostaria de ter toda vez que precisasse fazer isso, foi ai que pensei então no GoDiffExporter, um exportador em PDF de um arquivo DIFF qualquer.

Basicamente o parser do DIFF é feito e depois eu itero nas diferenças e crio o PDF, usando a lib GoFPDF, que inclusive colaborei recentemente adicionando o suporte a fontes embarcadas através de um array de bytes que vai dentro da sua própria aplicação, removendo a necessidade de distribuir as fontes em si (https://github.com/jung-kurt/gofpdf/pull/79).

O resultado do GoDiffExplorer é um PDF como este:

 

O projeto e as instruções de como instalar e usar estão na página do projeto:

https://github.com/prsolucoes/godiffexporter

 

Espero ter ajudado com este artigo.

Obrigado e até o próximo post pessoal.

Golandy – Game multiplayer open-source em HTML5 com Phaser + Golang e WebSocket – Versão para desktop, browser, android e iOS

Olá pessoal,

A um tempinho atrás fiz um game bem simples, usando HTML5 + Phaser e Go + WebSocket.

Fiz também os arquivos necessários para rodar o projeto tanto em desktop, web, android e iOS usando o Apache Cordova.

O link do game rodando é:

http://golandy.prsolucoes.com

Os links para baixar se encontram no meu Github, segue:

Cliente: https://github.com/prsolucoes/golandy-web

Servidor: https://github.com/prsolucoes/golandy-server

 

Sobre o jogo, ele é um tipo de clone do clássico bomberman. É multiplayer em tempo real. Fiz usando a engine Phaser e o servidor em Go. Toda a comunicação usa WebSocket e a versão nativa do Google, pois o desempenho da versão Gorilla é horrível.

Os mapas podem ser editados usando o MapEditor/Tiled (padrão tmx).

O game funciona no navegador, no desktop, no android, no iOS e onde mais o Apache Cordova suportar, pois como é em HTML5, qualquer browser roda ele. Em casa por exemplo, minha filha joga na TV.

É claro que o jogo não é perfeito e a comunidade da engine não ajuda muito.

Segue imagem:

Golandy Game Screenshot

 

Espero com este projeto, que a idéia e a arquitetura possam servir de inspiração para outros projetos e trabalhos.

Obrigado e até o próximo post pessoal.

 

Novos projetos open-source: GoCI e GoHC (integração contínua e healthcheck)

Olá pessoal,

Gostaria de compartilhar com vocês os meus dois novos projetos open-source em Go (golang).

1 – GoCI

O GoCI é um projeto para integração contínua de fácil instalação, manutenção e configuração.

Com ele você pode criar suas tarefas de integração através de execuções em CLI ou através de arquivos Javascript.

A inicialização do projeto é feita por dois arquivos principais, o config.ini e o arquivo do seu projeto em JSON, que podem ser vários na verdade.

O GoCI exporta algumas variáveis pro Javascript, a fim de que você possa implementar sua lógica de teste, deploy ou qualquer outra tarefa e ainda controlar cada um destes objetos. Ao manipular estes objetos você acompanha todos os resultados em tempo real através da interface web do GoCI, como os outputs, a barra de progresso, a duração da execução, etc.

Cada tarefa pode mostrar resultados em diversas abas, a aba principal é a Console, onde o output geral aparece ali, além do output normal, você tem output de erro, sucesso, alerta, etc.

Cada tarefa do seu projeto pode ter vários passos (steps), sendo cada passo baseado em um plugin, que como falamos, podem ser “cli” ou “js”.

Porém o projeto não se limita somente a desenvolvimento ou testes e deploy de uma aplicação. Você pode fazer o que quiser dentro dele. Você pode criar mais plugins, caso queira. Eu tenho algumas tarefas por exemplo, que enviam push pro meu device de teste, tenho outra que baixa os arquivos de linguagens atualizados da ferramenta de localização e coloca dentro do projeto.

O projeto vem com uma pasta “extras/sample” com os arquivos de exemplo, embora sejam bem simples.

Toda a interface foi pensada para funcionar perfeitamente em smartphones, tablets ou PCs.

Segue algumas imagens:

Link para o projeto:

https://github.com/prsolucoes/goci 

 

2 – GoHC

O GoHC é um sistema passivo de healthcheck com suporte a notificações quando entra em modo warning ou error. Ele é passivo por não ser de sua responsabilidade realizar a operação de validação, pois criaria um limite e o propósito do projeto é poder criar healthcheck para qualquer coisa que possa entrar em contato com o servidor onde estiver rodando.

Exemplos do que você pode fazer com ele:

  1. Validar se uma URL/servidor/IP está ativo.
  2. Medir tempo de determinadas operações, como o intervalo de tempo de processamento do pagamento do cliente com o seu gateway de pagamento. Você pega este intervalo em sua aplicação e envia pro healthcheck validar se ele está dentro do range de sucesso, alerta ou crítico/erro/falha.
  3. Validar de a quantidade de memória/cpu/disco/network está dentro de um range.
  4. Validar se a quantidade de humidade de uma planta está dentro de um range e emitir um alerta se estiver em nível crítico.

Com este sistema de healthcheck você possui 3 formas de validar a “saúde” do que você precisa monitor e esta validação pode ser automática dentro dos 3 ranges possíveis (sucesso, alerta, erro/falha) ou manual, onde você diz qual é o status manualmente.

  1. Ping – é o tipo mais simples, você chama o healthcheck e ele de acordo com o último ping enviado e o atual verifica em qual das áreas do range você está e envia alertas ou não – mas é você quem diz o tempo do ping para cada range.
  2. Range – é o tipo mais específico, onde você especifica as áreas dos ranges e ao receber um range qualquer, ele valida em qual dos ranges você está baseado no range enviado.
  3. Manual – é o tipo onde você diz o status diretamente, não tem informação de ping ou range neste tipo, o status que você enviar é o que ele vai assumir e pode enviar alertas também caso você especifique.

Tudo isso pode ser acompanhado através de uma interface web bem amigável e que foi pensada para funcionar perfeitamente em smartphones, tablets ou PCs.

Existe na interface hoje o modo lista de healthchecks e o modo dashboard, dependendo de como você quer ver os healthchecks você pode optar por um ou por outro. Se você quer deixar numa televisão, sugiro o modo dashboard.

Os alertas são baseados em plugins. Hoje eu criei apenas alguns, mas essenciais.

  1. CLI – executa algo no servidor no CLI
  2. SendGrid – envia um email usando o sendgrid
  3. PushBullet – envia um push usando o pushbullet
  4. Http Get – faz requisição HTTP GET em uma URL
  5. Slack – envia via webhook uma mensagem para o serviço Slack

A inicialização do projeto é feita por dois arquivos principais, o config.ini e um arquivo JSON chamado healthchecks.json com a lista de seus healthchecks e plugins de alerta.

O projeto vem com uma pasta “extras/sample” com os arquivos de exemplo, embora sejam bem simples.

No arquivo config.ini, você pode especificar uma propriedade chamada warmTime, que define um tempo após a inicialização para o sistema começar a processar os healthchecks.

Segue algumas imagens:

Segue o link do projeto:

https://github.com/prsolucoes/gohc

 

É isso pessoal, espero ter ajudado alguém com estes projetos.

Obrigado e até o próximo post pessoal.

Golang – Ferramenta para upload do arquivo DSYM para o Fabric/Crashlytics

Olá pessoal,

Lancei uma ferramenta para enviar o arquivo DSYM (arquivo contendo os “debugs symbols” gerado ao compilar uma aplicação para OSX ou iOS) para o Fabric/Crashlytics manualmente, via linha de comando.

Você pode integrar esta ferramenta em seu processo de deploy ou integração contínua, usando o Jenkins ou Fastlane por exemplo.

Uma dica para quem vai usar com o Fastlane é usar o comando abaixo para executar a ferramenta:

sh "cd .. && fabric-upload-dsym --bundleid=[YOUR-APP-BUNDLE] --fabricapikey=[YOUR-FABRIC-API-KEY] --file=[ZIPPED-DSYM-FILE]"

 

Obrigado e até o próximo post pessoal.

Golang – Nova versão 1.6 (suporte nativo a HTTP2)

Olá pessoal,

No dia 17 de fevereiro saiu a versão 1.6 da linguagem Go (Golang).

Em termos de velocidade o Google se empenhou na versão 1.5.1 em deixar ela o mais rápido possível e o garbage collector o mais otimizado também, então com relação a isso, não mudou tanto.

Os destaques desta nova versão ficam por conta dos itens:

  • Suporte ao protocolo HTTP2, habilitado por padrão
  • Suporte ao recurso “vendor”, que era experimental até então, para as bibliotecas
  • Em aplicações onde há um maior consumo de memória, a versão 1.6 está mais rápida
  • O algoritmo de ordenação da função “sort.Sort” está 10x mais rápido, porém pode causar alguma incompatibilidade, pois os itens não ficam na mesma ordem (use “sort.Stable” para manter a ordem original)
  • Algumas melhorias também ocorreram na parte de templates do Go

A lista completa você pode conferir aqui:

https://golang.org/doc/go1.6

 

Obrigado e até o próximo post pessoal.

 

 

Golang – LogStack – Nova ferramenta criada para armazenar, pesquisar e coletar estatísticas de Logs

Olá,

A um tempo atrás lancei uma nova ferramenta chamada LogStack que me ajudou muito a fazer o debug de aplicações web e mobile.

Esta ferramenta é um centralizar de logs que geralmente são exibidos no console das ferramentas, porém, como cada ferramenta tem uma forma de exibir isso e as vezes é muito ruim e dificultoso ficar observando e lendo na ferramenta ou na IDE, o LogStack vem para generalizar isso e deixar o desenvolvedor visualizar tudo no navegador em tempo real e com uma interface bem amigável, capaz de se adequar a um smartphone, tablet ou desktop (resumindo: layout responsível).

Agora, tecnicamente a ferramenta conta com tecnologias bem interessantes para estudo: Golang + Elasticsearch ou MongoDB.

Você pode através do arquivo de configuração escolher qual datasource usar e o LogStack possui uma API para cada ação, seja inserir, coletar estatísticas, pesquisar, etc.

Baixe a ferramenta aqui:

https://github.com/prsolucoes/logstack

Algumas imagens:

 

 

Obrigado e até o próximo post pessoal.

Golang – Novas bibliotecas – Lista thread safe e web response

Olá,

Recentemente desenvolvi duas bibliotecas para o Go, uma é uma lista sincronizada (lista thread safe) e a outra é uma biblioteca para padronizar as respostas de um serviço retornando os dados em JSON.

Segue abaixo os respectivos repositórios:

https://github.com/prsolucoes/gotslist

e

https://github.com/prsolucoes/gowebresponse

 

Obrigado e até o próximo post pessoal.

 

Golang – Novo projeto opensource chamado Gonotin

Olá,

Recentemente necessitamos fazer uma comparação de arquivos para saber se os números de telefone de uma base existiam em outra e depois de várias tentativas para achar a quantidade correta de registros, eu desenvolvi alguns scripts para fazer essa comparação independente da ordem dos dados e realizando a comparação um a um.

Inicialmente fiz em PHP, porém usando a função IN_ARRAY, notei que a performance estava péssima. Com um arquivo de 200mil (2.5mb) registros esperei quase 45 minutos e ainda não tinha finalizado, por fim desisti e resolvi reescrever usando o Go.

Ao reescrever o código em Go o processamento foi quase que imediato usando a abordagem do MAP. Você cria um map com a chave a valor sendo o texto que você tem e verifica se os itens existem no MAP ou não.

Após esta abordagem funcionar muito bem no Go, escrevi diversas formas no PHP de processar os mesmos arquivos para fazer um benchmark de performance e a melhor performance alcançada foi usando a função ISSET.

Depois decidi também criar um gerador de arquivos com números aleatórios para fazer listas com dados para os meus testes e validar possíveis erros e melhorar os scripts.

Todo o código está disponível no Github de forma gratuita e pode ser acessado em:

https://github.com/prsolucoes/gonotin

 

Dá pra fazer a mesma usando a função DIFF do linux/osx, porém os dados precisam estar ordenados nas duas listas.

Espero com este script poder ajudar a todos que precisam resolver este problema de forma prática.

Obrigado e até o próximo post pessoal.

Golang – WebRemoteLog – Um serviço feito com a linguagem Go para log remoto

Olá,

Tenho visto o frequente uso da linguagem Go em diversas empresas. Existem diversos artigos e eventos que participo em que algumas empresas citam seu caso de uso.

Passei então a estudar até conseguir compreender os conceitos e decidi fazer um projeto que estava em minha lista a um bom tempo, porém ao invés de fazer em PHP com Yii2 decidi fazer com Go + MongoDB.

O projeto WebRemoteLog consiste em um gerenciador de log remoto. Sua aplicação faz o log enviando os dados através de uma chamada ao serviço da aplicação e este log fica gravado em uma coleção do MongoDB. A interface web serve para visualizar os logs em tempo real, como no console da IDE, além de permitir que você possa filtrar as mensagens.

Com este simples projeto, eu usei três recursos da linguagem e seus pacotes: http(rotas, rest, get, post), MongoDB, json.

O resultado ficou muito bom e eficiente. O código fonte do projeto está no github:

https://github.com/prsolucoes/WebRemoteLog-Go

Imagens:

Você pode baixar, modificar e colaborar livremente.

Obrigado e até o próximo post pessoal.