Marcio Trindade

Artigos

Brincando com Go parte 2

Este artigo é uma continuação do artigo anterior Brincando com Go parte 1 que se você ainda não viu recomendo que comece por ele. Nesta etapa vamos separar a nossa lista de emails em 3 slices e escrever estes em arquivos distintos.

Primeiro vamos adicionar a lógica pra separar os emails em 3 slices.

example.go
...
// lendo o arquivo inteiro e atribuindo o valor na variável lines,
// se um erro ocorrer ficará na variável err.
lines, err := reader.ReadAll()

// Loga o erro se o mesmo ocorrer
// e para a execução do programa.
if err != nil {
        log.Fatal("Error reading all lines: ", err)
}

// declarando as variaveis que serão utilizadas
// para fazer as separações dos emails
var headers []string
var validEmails [][]string
var invalidEmails [][]string
var duplicatedEmails [][]string

// vamos criar agora uma variável do tipo map, que
// é bem parecido com o hash do Ruby,para
// identificarmos os emails duplicados.
existEmails := make(map[string]bool)

// loop for pra interar em todos os emails
for i, line := range lines {
        // separando a primeira linha que é o
        // cabeçalho do CSV.
        if i == 0 {
                headers = line
                continue
        }

        // tratando o email, que deve ser sempre
        // a primeira coluna do arquivo.
        email := line[0]
        // remove os espaços em branco.
        email = strings.TrimSpace(email)
        // transforma em caixa baixa.
        email = strings.ToLower(email)
        // retorna o email tratado para o csv.
        line[0] = email

        // verifica se já existe a chave email no map.
        if existEmails[email] {
                // se tiver adicionamos a linha no slice de emails duplicados.
                duplicatedEmails = append(duplicatedEmails, line)
        } else {
                // verifica se o email é válido atraves de expressão regular.
                valid, _ := regexp.MatchString(`^[a-z0-9._%+\-]+@[a-z0-9.\-]+\.[a-z]{2,4}$`, email)
                if valid {
                        // emails válidos são adicionados no slice de emails válidos.
                        validEmails = append(validEmails, line)
                } else {
                        // emails inválidos são adicionados no slice de emails inválidos.
                        invalidEmails = append(invalidEmails, line)
                }
                // adiciona o email no map de emails duplicados sendo
                // a chave o email e o valor um boleano true
                existEmails[email] = true
        }
}

// logando os emails já separados
log.Println("headers", headers)
log.Println("validEmails", validEmails)
log.Println("invalidEmails", invalidEmails)
log.Println("duplicatedEmails", duplicatedEmails)
...

Brincando com Go parte 1

Comecei a estudar Go a pouco tempo e estou gostando do que estou aprendendo, é incrível como escrever é simples e a performance é realmente boa. Mesmo a linguagem sendo tipada e compilada isso não deixa as coisas chatas.

Depois de fazer o tour comecei a escrever um programa simples que lê um arquivo csv com uma lista de emails e a separa em emails válidos, inválidos e duplicados. O código do mesmo está disponível no github.

Pretendo fazer aqui um pequeno passo a passo de como escrevi este programa. Neste primeiro momento vamos ver como receber o nome do arquivo como argumento e ler o mesmo.

Pra tratar os argumentos é bem simples, você só precisa importar o pacote "os" e este tem uma variável chamada Args que é um slice de strings com os argumentos sendo o primeiro deles o nome do programa.


Temas do Sublime Text 3

Hoje queria trocar o tema do meu sublime text editor, então percebi que esta não é uma tarefa muito fácil, por que você precisa fazer isso pelo menu.

Procurei uma maneira mais fácil e a opção que encontrei foi alterar meu arquivo de configuração, mas como saber quais são todos os temas disponíveis? Procurei a lista com todos eles e não encontrei então com alguma paciência eu criei a lista abaixo.

Default
"color_scheme": "Packages/Color Scheme - Default/All Hallow's Eve.tmTheme",
"color_scheme": "Packages/Color Scheme - Default/Amy.tmTheme",
"color_scheme": "Packages/Color Scheme - Default/Blackboard.tmTheme",
"color_scheme": "Packages/Color Scheme - Default/Cobalt.tmTheme",
"color_scheme": "Packages/Color Scheme - Default/Dawn.tmTheme",
"color_scheme": "Packages/Color Scheme - Default/Eiffel.tmTheme",
"color_scheme": "Packages/Color Scheme - Default/Espresso Libre.tmTheme",
"color_scheme": "Packages/Color Scheme - Default/IDLE.tmTheme",
"color_scheme": "Packages/Color Scheme - Default/iPlastic.tmTheme",
"color_scheme": "Packages/Color Scheme - Default/LAZY.tmTheme",
"color_scheme": "Packages/Color Scheme - Default/Mac Classic.tmTheme",
"color_scheme": "Packages/Color Scheme - Default/MagicWB (Amiga).tmTheme",
"color_scheme": "Packages/Color Scheme - Default/Monokai Bright.tmTheme",
"color_scheme": "Packages/Color Scheme - Default/Monokai.tmTheme",
"color_scheme": "Packages/Color Scheme - Default/Pastels on Dark.tmTheme",
"color_scheme": "Packages/Color Scheme - Default/Slush & Poppies.tmTheme",
"color_scheme": "Packages/Color Scheme - Default/Solarized (Dark).tmTheme",
"color_scheme": "Packages/Color Scheme - Default/Solarized (Light).tmTheme",
"color_scheme": "Packages/Color Scheme - Default/SpaceCadet.tmTheme",
"color_scheme": "Packages/Color Scheme - Default/Sunburst.tmTheme",
"color_scheme": "Packages/Color Scheme - Default/Twilight.tmTheme",
"color_scheme": "Packages/Color Scheme - Default/Zenburnesque.tmTheme",

Utilize o Gmail para todas suas contas

O assunto de hoje é um "off topic" que vale a pena comentar aqui, eu tenho mais de uma conta de email e no caso esta segunda, que vou chamar de conta "X", não é um gmail. Logo eu não consigo utilizar a interface web do google.

Por que utilizar a interface do Gmail.

  • Pra mim é muito melhor do que todos os clientes de email que já utilizei;
  • Não utiliza espaço no meu SSD;
  • Está disponível pra qualquer computador, tablet ou telefone;
  • Possui uma busca incrível e muito rápida;
  • Tem a melhor organização que conheço (multi-labels).

Tendo isso em mente tentei de algumas formas receber os meus emails da conta "X" na caixa de entrada do Gmail e não consegui, foi então que pensei em uma solução que resolveria os meus problemas, decidi escrever uma aplicação simples em Ruby que conecta na conta "X" copia os emails pra conta do Gmail e depois apaga o email da conta "X".

A idéia é bem simples e tem funcionado pra mim a mais de 6 meses, por isso resolvi compartilhar para que mais pessoas que prefiram utilizar o gmail possam o fazer também.


Rails + Unicorn + Upstart + Monit

Hoje vou mostrar como estou utilizando o deploy deste blog que é um projeto Rails com o código fonte aberto. O mesmo está rodando em um servidor linux "Ubuntu 14.04.1 LTS (Trusty Tahr)". Não vou entrar em detalhes aqui de como preparei a máquina, mas deixo a dica de que estou utilizando Ansible pra isso.

Unicorn

A configuração do unicorn que eu estou utilizando não tem muito segredo, é uma configuração simples que você encontra parecidas no github como exemplo.

/etc/unicorn/blog.rb
listen            "/tmp/blog-unicorn.sock"
logger            Logger.new($stdout)
pid               "/var/run/blog/unicorn.pid"
preload_app       true
timeout           10
worker_processes  2
working_directory "/var/www/blog/current"

before_fork do |server, worker|
  defined?(ActiveRecord::Base) and ActiveRecord::Base.connection.disconnect!
end

after_fork do |server, worker|
  defined?(ActiveRecord::Base) and ActiveRecord::Base.establish_connection

  child_pid = server.config[:pid].sub(".pid", "#{worker.nr}.pid")
  system("echo #{Process.pid} > #{child_pid}")
end

Conhecendo o Monit

Monit é um utilitário pequeno e open source criado para gerenciar e monitorar sistemas unix.

Eu passei a utilizar o monit para monitorar os meus projetos pessoais ao invés da gem God que além de mais complexo é escrito em Ruby.

O Monit está disponível para algumas plataformas, vou mostrar como eu instalei no Ubuntu utilizando o gerenciador de pacotes apt. No site do monit tem algumas outras formas de distribuição ou até mesmo o código fonte para ser compilado:

console
# atualize os pacotes
sudo apt-get update
# instale o monit
# sudo apt-get install monit

A nova sintaxe de mocks do rspec

No último artigo escrevi sobre a nova sintaxe do rspec, agora vou falar sobre a nova sintaxe para os mocks do rspec. Veja a documentação.

Apartir do rspec 2.14.0 as duas sintaxes estão presentes e você pode especificar qual deseja usar no spec_helper.

spec_helper.rb
RSpec.configure do |config|
  config.mock_with :rspec do |c|
    # c.syntax = [:expect, :should]
    # c.syntax = :should
    c.syntax = :expect
  end
  config.expect_with :rspec do |c|
    # c.syntax = [:should, :expect]
    # c.syntax = :should
    c.syntax = :expect
  end

A nova sintaxe do rspec

O Rspec agora possui uma nova sintaxe que ao meu ponto de vista ficou um pouco mais coeso com o que realmente o teste está testando.

Pra configurar é bem simples, basta você setar qual modo deseja usar no seu spec_helper.

spec_helper.rb
RSpec.configure do |config|
  config.expect_with :rspec do |c|
    # c.syntax = [:should, :expect]
    # c.syntax = :should
    c.syntax = :expect
  end
end

Acredito que o código acima é auto explicativo e não se faz necessário explicações.


Utilizando gems locais em desenvolvimento

Hoje encontrei uma dica muito útil no site The Life of a Radar.

Quem utiliza alguma gem na qual está trabalhando constantemente sabe como é chato ficar alterando o arquivo Gemfile sempre que vai fazer um deploy. Este é o meu caso que tenho os models do meu projeto separado em uma gem (Rails Engine) a fim de reutiliza-los em todos os projetos, tanto front-end quanto workers.

Como a maior parte do tempo estou desenvolvendo, mantenho o meu Gemfile configurado desta forma:

Gemfile
gem 'projet-models', path: "../project-models"

Começando com Mongoid

Hoje quero mostrar algo muito simples, mas é pra encorajar as pessoas que ainda não usaram o MongoDB como banco de dados de seus projetos.

É importante você conhecer pelo menos um pouco do mongodb, saber como instalar, iniciar, parar, reiniciar, fazer uma query e inserir e editar documentos.

Depois que já tiver este background então vale a pena dar uma olhada na página do Mongoid, que é uma ótima gem criada pelo Durran Jordan pra trabalhar com mongodb no rails.