Exercism – Practice your dev skills

A week ago I  was trying to find some algorithm exercises and I found exercism.io, a website that helps you practice your developer skills using your terminal, your favorite IDE and TDD 🙂

Captura de Tela 2015-12-28 às 18.12.33

Besides the TDD approach, what I really liked about it is that it encourages you to solve problems iteratively, one test at a time and when all tests are passing, refactor your code for a better solution.

It also lets you discuss each others solutions and I’ve already received some nice advices. Some exercises also made me learn some new methods that I’ve never used before like reducetr and learn that count can receive a block!

I’m practicing Ruby but they have exercises for a lot of other languages like: PHP, Lua, Lisp, F#, Javascript and Elixir.

I suggest you try it and then let me know if you liked it or not and if you did, comment here your profile so we can try to help you improve your coding skills 🙂

ps: you can also see my answers and help me improve mine

When you’re the senior in junior/senior pair programming, the measure of your success is how much the junior learns.

Kent Beck on twitter.

I guess that’s also true on a daily basis on a project where there are some people with way more experience than others 🙂

Useful RSpec matchers that you may not be using

Just sharing a couple RSpec matchers that I think are very useful but people doesn’t seem to know they even exist 🙂

all matcher

When I wanted to make sure that every element of an Enumerable, for example, should be an instance of Course, I would write:

it 'populates @catalog_courses only with courses' do
  assigns(:catalog_courses).each do |course|
    expect(course).to be_a(Course)
  end
end

But with the all matcher, its just:

it 'populates @catalog_courses only with courses' do
  expect(assigns(:catalog_courses)).to all( be_a(Course) )
end

I used the be_a matcher inside the all but you could use any other like: be_truthy or eq.

contain_exactly matcher

When I wanted to make sure that an Array should include a and b elements but in any order I would write something like:

it 'populates @courses with courses a, b and c' do
  courses = assigns(:courses)

  expect(courses).to include(a)
  expect(courses).to include(b)
  expect(courses).to include(c)
end

Now, using the contain_exactly matcher:

it 'populates @courses with courses a and b' do
  expect(assigns(:courses)).to contain_exactly(a, b, c)
end

Hope you learned something new here. Leave in the comments any other awesome matcher that you think other people may not be using 😀

As 3 palavras mais difíceis de serem ditas mas que deveríamos dizer mais

Imagine que você foi convidado a ouvir uma história simples para em seguida responder a algumas perguntas. Eis a história:

Uma garotinha chamada Mary vai à praia com a mãe e o irmão em um carro vermelho. Na praia, nadam, tomam sorvete, brincam na areia e almoçam sanduíches.

Agora, as perguntas:

  1. De que cor era o carro?
  2. Eles comeram peixe e fritas no almoço?
  3. Ouviram música no carro?
  4. Tomaram limonada no almoço?

Muito bem, como você se saiu? Em uma pesquisa com crianças, quase todas elas responderam corretamente às duas primeiras perguntas (“vermelho” e “não”). Mas em geral se saíram muito pior com as perguntas 3 e 4. Por quê?

Simplesmente porque essas perguntas não podiam ser respondidas, não havia informação suficiente na história. No entanto, 76% das crianças responderam “sim” ou “não”.

Dizem por aí que as 3 palavras mais difíceis de serem ditas são eu te amo, porém, existem outras 3 palavras ainda mais difíceis de serem ditas eu não sei.

O que é uma pena pois enquanto você não admitir aquilo que não sabe, é praticamente impossível aprender o que precisa aprender.

Esse é um trecho de um livro que estou lendo, Pense como um freak. Achei que valia a pena transcreve-lo aqui para que outras pessoas possam refletir sobre a necessidade de verbalizar mais essas 3 palavrinhas.

Acredito que esta é uma dica muito valiosa e, apesar de ser uma mudança simples, tem o poder de melhorar muito nossos relacionamentos pessoais ou profissionais.

Escrevi este post justamente para poder facilmente ajudar meus amigos a refletirem sobre isso. Faça o mesmo com seus amigos 🙂

Tutorial: Como criar um sitemap dinâmico com rails (inclusive no Heroku usando S3)

Então, todos sabem que ter um sitemap bem definido é bem útil né? É ótimo pra SEO e tudo mais! Mas como fazemos pra criar um dinamicamente usando Ruby on Rails?

E se usarmos um host, como o Heroku, que não permite a criação de arquivos estáticos? Aí usamos o S3 pra contornar isso 🙂

Vamos lá:

1. Se cadastre no Amazon Web Services, mais especificamente pra usar o S3.

2. Crie um IAM user e anote a KEY_ID e a ACCESS_KEY.

3. Crie um bucket no S3, anote o nome dele.

4. Altere a “bucket policy” dele. Pra isso selecione ele, clique para exibir suas propriedades e você encontrará essa opção dentro de “permissions”.

{
	"Version": "2012-10-17",
	"Id": "Policy1432927162812",
	"Statement": [
		{
			"Sid": "Stmt1432927158236",
			"Effect": "Allow",
			"Principal": {
				"AWS": "*"
			},
			"Action": "s3:GetObject",
			"Resource": "arn:aws:s3:::NOMEDOBUCKET/sitemaps/*"
		}
	]
}

5. Instale a gem sitemap_generator e a aws-sdk adicionando ambas ao seu Gemfile:

gem 'aws-sdk'
gem 'sitemap_generator'

Depois rode:

rake sitemap:install

Essa rake task irá criar o arquivo config/sitemap.rb, nele terão comentários explicando direitinho como você faz pra adicionar URLs ao seu sitemap. No repositório da gem tem mais detalhes.

Mantenha as configurações assim:

SitemapGenerator::Sitemap.default_host = "http://www.SEUDOMINIO.com.br"
SitemapGenerator::Sitemap.create_index = true
SitemapGenerator::Sitemap.public_path = 'public/sitemaps/'
SitemapGenerator::Sitemap.sitemaps_host = "http://s3.amazonaws.com/NOME-DO-BUCKET/sitemaps/"

6. Defina variáveis de ambiente com o que anotamos previamente:

AWS_ACCESS_KEY_ID: AKIAIPZEMVLPPLEOBIIK
AWS_SECRET_ACCESS_KEY: 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
S3_BUCKET: nome-do-bucket

Não sabe fazer isso? Aprenda o que é. Eu uso o dotenv pra isso.

7. Crie uma rake task lib/tasks/sitemap.rb para enviar esse sitemap para o S3:

require 'aws'

namespace :sitemap do
  desc 'Upload the sitemap files to S3'
  task upload_to_s3: :environment do
    s3 = AWS::S3.new(
      access_key_id: ENV['AWS_ACCESS_KEY_ID'],
      secret_access_key: ENV['AWS_SECRET_ACCESS_KEY']
    )
    bucket = s3.buckets[ENV['S3_BUCKET']]

    Dir.entries(File.join(Rails.root, "public", "sitemaps")).each do |file_name|
      next if ['.', '..'].include? file_name
      path = "sitemaps/#{file_name}"
      file = File.join(Rails.root, "public", "sitemaps", file_name)

      begin
        object = bucket.objects[path]
        object.write(file: file)
      rescue Exception => e
        raise e
      end
      puts "Saved #{file_name} to S3"
    end
  end
end

8. Crie um scheduler no Heroku (ou no seu host) pra chamar essa rake task de tempos em tempos.

rake sitemap:refresh sitemap:upload_to_s3 --trace

A primeira task gera um novo sitemap e a segunda o envia para o S3. Gosto de adicionar –trace pra deixar tudo no log.

Pronto! Demorou um pouco mas deu certo né? Se não deu, comenta aí que tentou lhe ajudar.

ps: esse tutorial foi baseado em um do w1zeman1p mas dei uma melhorada, além de traduzir 🙂

startup care package

O Startup Care Package é um pacotão de créditos, descontos e meses de trials que custariam 4.000 dólares mas, nesse bundle, sai de graça!

Destaques para:

  • Olark – widget de chat pro seu site;
  • Close.io – ferramenta que ajuda a vender mais;
  • Treehouse – vários excelentes cursos online;
  • 15Five – tipo um “standup meeting” pra times remotos;
  • Zapier – ganhe 3 ebooks;
  • Lookback – pra quem trabalha com apps pra iOS;
  • Learnable – cursos online pra devs;
  • HeyUpdate – ferramenta que facilita saber quem trabalhou no que durante o dia;
  • Mention – monitore sua marca na internet;