Golang

Acessando a porta serial

No canal Test After Deploy tivemos uma ótima explicação do funcionamento do tmux. E para mim uma das coisas mais interessantes é que os desenvolvedores preferiram deixar de fora algumas coisas que tem no screen, como o suporte a telnet e a portas seriais, eles fizeram isso porque acreditam na filosofia UNIX de faça apenas uma coisa e faça bem feito. E na minha opinião eles estão muito certos.

Go brincando com bits

Brincando com bits Estou brincando com um projeto de um interpretador BASIC escrito em Go e a saída de video em modo texto segue o padrão de cores do CGA ou seja um byte contem nos quatro bits mais altos o código para a cor do fundo e nos quatro bits mais baixos o código para a cor da fonte. Ou seja 16 cores para as letras e 16 cores para o fundo.

Interpretador BASIC

Por que? Você deve estar se perguntando algo como “por que diabos um interpretador BASIC nos dias de hoje?“. Bom já a algum tempo eu estava querendo uma maquina para ensinar os princípios da computação para minha filha, e precisa ser uma maquina resistente, para resistir a uma criança de 5 anos tem que praticamente ser um tanque de guerra, e não pode ter nada sofisticado em termos de sistema operacional, nada de Linux ou Windows porque a maquina não pode ter um sistema de arquivos montado que precise ser desligado corretamente, precisa ser algo que seja desligado simplesmente cortando o fornecimento de energia e que ligue instantaneamente caindo em um prompt de alguma linguagem simples, sem ícones sem comandos para carregar o interpretador, nada, ligou ta pronto para receber comandos.

Dicas de Go defer

Defer Usar defer e poder adiar um comando para ser executado apenas quando a função terminar não importando a forma como ela terminar é uma grande ideia. Imagine uma função com vários pontos de retorno, seja para retornar erros ou porque ela terminou corretamente, ficar gerenciando fechar arquivos, conexões, mutex e o que mais você estiver usando em cada retorno é entediante e inseguro, você pode esquecer um dos retornos, e pode apostar que esse único retorno que você esqueceu é que vai tirar horas do seu sono.

Go previnindo data race

No projeto do Ricardo Gomes onde ganhamos uma bela performace também acabamos acidentalmente incluindo uma bela data race. Data race acontece quando você tem acessos simultâneos a mesma variável por duas threads diferentes. Mas Go tem ferramentas para tudo, e nessa brincadeira eu aprendi sobre o parâmetro -race. Esse parâmetro faz com que o Go procure por possíveis data races em seu código e pode ser usado com test, run, build e install.

Go carregando arquivos Sped Fiscal 95% mais rápido

No ultimo domingo eu e o Ricardo Gomes da Fix Auditoria fizemos pair programming com a missão de melhorar o parse de EFD Fiscal que ele esta desenvolvendo em Golang. O nosso objetivo era fazer o parser ganhar alguma performace e também resolver alguns pequenos problemas na carga dos arquivos. O que o sistema faz até o momento é o seguinte: Le vários arquivos texto contendo centenas de milhares de registros, parseia esse conteúdo linha a linha e por fim grava tudo no banco de dados.

Go percorrendo a árvore de diretórios

Eu estava com um problema de ter que digitar o caminho completo para chegar no diretório do projeto que eu queria trabalhar, esta tudo no GOPATH e os caminhos geralmente são longos. Tudo bem digitar todo o caminho uma vez ou outra, mas como estou trabalhando todo dia com Go e em mais de um projeto ter que digitar o caminho completo rapidamente se torna uma tarefa entediante. E as vezes eu nem sei onde exatamente o projeto esta, as vezes não lembro alguma parte do path como o nome do autor ou se esta no GitHub ou em outro repositório.

Como usar goConfig

goConfig goConfig é um pacote para tornar fácil implementar as três principais formas de configuração de um sistema, ou seja, ler parâmetros da linha de comando, variáveis de ambiente e arquivos de configuração. A ideia é tornar a lentura da configuração bem simples porque a tendência a complexidade do seu sistema aumentar e não tem porque ter mais complexidade só porque você quer adicionar mais um parâmetro ou mais uma variável de ambiente.

Go lendo arquivo com bufio

Lexer, tokenizer, scanner… Tenho vários projetos que poderiam se beneficiar de um lexer genérico e escrito em Go, então resolvi brincar com a ideia de escrever o meu próprio. Eu sei, eu poderia ter usado text/scanner mas depois de alguns testes achei ele difícil de expandir, também poderia ter usado um dos muitos que estão prontos por ai, mas não encontrei nada que eu não precisasse aprender uma nova ferramenta alem da linguagem ou mergulhar na mente do criador original para entender o que ele queria fazer.

go usando time e canais

Pacote time Eu sou o primeiro a torcer o nariz para o pacote time, principalmente pela maneira como a formatação de datas é feita, mas um recurso muito interessante é poder criar um canal que retorna a cada X tempo e assim podemos executar ações periódicas. Veja como isso é feito Primeiro criamos um canal que vai retornar a cada X tempo, no caso do exemplo 300 milissegundos.

Go plugins

Plugins A possibilidade de criar plugins é um novo recurso da versão 1.8 que por enquanto funciona apenas no Linux. Um plugin basicamente é uma biblioteca externa que pode ser carregada dinamicamente, o uso é bem simples. O mesmo recurso deve ser incluso no macOS na versão 1.9 e provavelmente em outras plataformas. Por enquanto para todos poderem experimentar sugerimos subir um container Docker. O comando abaixo abre um container Docker com uma maquina virtual pronta para executar a versão 1.

Go transformando imagem PNG em código C

Já tem algum tempo eu estava desenvolvendo um projeto usando a DISCO-F746NG, uma placa bem interessante e com muitos recursos. Um dos recursos mais legais é o LCD-TFT com 4.3” e multi-touch. E a programação da placa é feita usando mbed que é um ambiente bastante bom apesar de eu torcer o nariz para ele. Apesar de muitas qualidades essa placa não tem recursos muito avançados para tratamento de imagem via hardware, para desenhar você simplesmente escreve na memória de vídeo… no bom e velho estilo dos anos 90 gravando pixel a pixel :D

Go com Intel Edison Lendo valor analógico

Este é mais um post da serie falando sobre Go com Intel Edison, e estou usando bastante do que já falei em outros posts como tratamento de sinais por exemplo. Para gerar o sinal analógico vamos usar um potenciômetro, ou melhor RAS, Rotary Angle Sensor :D. O estilo do código é muito parecido com o que fizemos para gerar sinais PWM, mas agora a operação é de leitura. Lendo valores analógicos com MRAA.

Go com Intel Edison controlando saída PWM

PWM ou Pulse Width Modulation tem uma gama enorme de aplicações, usamos para controlar servos, definir o brilho de LEDs, potência de motores, regular tenção, efeitos sonoros e por ai vai. PWD com MRAA Como de costume poderíamos ter chamado diretamente as funções da MRAA, mas daí o código fica muito mais confuso, uma pratica melhor é dividir o programa em múltiplos arquivos. Primeiro o cabeçalho pwm.h que vai ser usado para incluir as funções C no código Go.

Tratando sinais com Go

Tratar sinais é uma boa pratica, dessa forma você pode finalizar seu programa graciosamente, liberando recursos, fechando banco de dados, etc. muito melhor que simplesmente fechar o programa. E tratar sinais do sistema operacional com Go é muito simples porque basicamente o sistema vai jogar o sinal em uma canal e então precisamos apenas ficar escutando. Primeiro criamos um canal sc := make(chan os.Signal, 1) Daí informamos qual o tipo de sinal estamos interessados, no caso ^C ou seja SIGINT.

Go com Intel Edison lendo um botão.

Continuando com a diversão com o Intel Edison e a linguagem Go, esse é um pequeno exemplo de como ler o estado de um botão e usar esse estado para exibir uma mensagem na tela e para acender um LED. Para facilitar o entendimento vamos ver duas formas de implementação, uma com tudo em um único arquivo e outra com um código mais organizado. Primeiro exemplo Crie um arquivo com o nome button.

Intel Bong com Edison

Eu quero emitir alertas sonoros no meu projeto de controle IoT e para isso eu precisava entender como a classe buzzer da biblioteca UPM funciona, dava para fazer tudo usando apenas a MRAA afinal é apenas um PWM em um terminal, mas vale a pena usar a UPM pois já vou usar para coisas mais pesadas como controle de periféricos i2c por exemplo. Outro motivo para esse pequeno tutorial é que a UPM tem vários recursos e bons exemplos mas não encontrei nenhum lugar explicando como compilar apenas usando os recursos do próprio Edison com uma simples linha de comando ou no máximo com um pequeno Makefile.

HTTPS com Golang no Linux

Gerando as chaves com letsencrypt.org Como eu mencionei no post sobre redirecionar tudo para HTTPS todas as comunicações entre cliente e servidor precisam ser criptografadas e com letsencrypt.org isso pode ser feito sem custo, com código aberto e muita documentação, o que no meu ponto de vista acaba com todas as desculpas para não usar HTTPS. Uma ressalva importante é que podem haver razões legais para preferir usar outra entidade certificadora, por exemplo se eu não estou enganado para ter valor legal no Brasil a entidade precisa ser brasileira.

Redirect to HTTPS

Tudo criptografado! Sem desculpas! Antigamente era caro e inconveniente exigir criptografia para servidores HTTP, você teria que no mínimo gastar alguns trocados com uma entidade certificadora. De um tempo para cá isso não é mais verdade, qualquer um pode usar os certificados da letsencrypt.org, é free, fácil de usar e as ferramentas são de código aberto, então não existe mais desculpa para não usar HTTPS nos seus servidores. Redirecionando para HTTPS Para redirecionar tudo os navegadores para a porta HTTPS eu escrevi um pequeno serviço em Go que simplesmente retorna o código 301 Moved Permanently para o navegador do usuário e indico o novo local apenas substituindo o URL Scheme de HTTP para HTTPS, e deixo o resto do trabalho para o navegador.

Go com Intel Edison

Golang com Intel Edison Como prometido no post sobre a construção do meu IoT home appliance, essa é a forma mais simples e segura de instalar Go no Edison. A maioria dos tutoriais que encontrei na internet pedem para compilar Go, o que dá bastante trabalho e demora. Isso se você não esbarrar com alguma dependência como a versão do git por exemplo, ou então adicionar repositórios que muitas vezes estão desatualizados tornando o Yocto instável.

IoT home appliance

IoT home appliance A ideia de construir um appliance para controlar algumas coisas de casa, automatizar algumas tarefas e criar alguns indicadores não é nada nova, mas é uma daquelas ideias que estou sempre adiando por um motivo ou outro. Até agora eu simplesmente não tinha encontrado uma plataforma de hardware e software que realmente me agradasse. Eu queria compatibilidade com o 80x86 mas não queria um PC ligado o tempo todo e também queria uma linguagem empolgante e moderna mas não queria nada interpretado, e escrever tudo em C é legal mas dá preguiça e aumenta a possibilidade do projeto retornar para a gaveta… Agora finalmente eu acredito que encontrei uma boa combinação com o Edison e Go.

String aleatória segura em Go usando crypto/rand

Como gerar uma string randômica segura em Go usando crypto/rand para pegar a string do gerador de números aleatórios do sistema. package main import ( "crypto/rand" "crypto/sha1" "fmt" ) func hash(b []byte) string { h := sha1.New() h.Write(b) sum := h.Sum(nil) armored := fmt.Sprintf("%x", sum) return armored } func randomString() (string, error) { b := make([]byte, 10) _, err := rand.Read(b) if err != nil { fmt.Printf("erro: %v", err) return "", err } armored := hash(b) return armored, err } func main() { armored, _ := randomString() fmt.

Usando Go Playground

Uma pequena demonstração sobre The Go Playground, e aproveitei para mostrar alguns recursos interessantes da linguagem. package main import ( "fmt" "math/rand" "time" ) func printValue(value int, c chan int) { rt := rand.Int31n(1000) time.Sleep(time.Duration(rt) * time.Millisecond) fmt.Printf("printValue: valor = %v\r\n", value) c <- value fmt.Printf("%v terminou\r\n",value) } func main() { rand.Seed(time.Now().Unix()) c := make(chan int) for i := 0; i < 10; i++ { go printValue(i, c) } for i := 0; i < 10; i++ { fmt.

Go Incrível

Uma lista curada de frameworks Go, bibliotecas e softwares. Realmente vale a pena para quem quer mergulhar na linguagem. https://github.com/avelino/awesome-go Se você desenvolveu alguma coisa interessante em Go também vale a pena submeter seu projeto para a lista, é muito bom ter seu projeto avaliado por terceiros sem contar que ajuda muito a tornar seu software mais visível para a comunidade Go. Leia atentamente os requisitos para enviar um link.