Fork me on GitHub

Keep Learning Conhecimento nunca é o bastante

Pair programming comigo!

Que tal aprender mais sobre técnicas e práticas para tornar seu trabalho desenvolvendo software mais prazeroso e satisfatório? Menos bugs, código limpo, bonito e flexível, testes rápidos e relevantes, entre outros benefícios, são facilmente obtidos através do estudo e prática de alguns fundamentos.

A partir desta semana estou disponível para workshops/sessões de pareamento presenciais focados nessas técnicas.

O que é?

Não é um curso. Não darei uma aula ou palestra. A ideia é que eu sente com os integrantes da equipe e, trabalhando em projetos reais do time, ensine e pratique as técnicas que aplico em meu código e sobre as quais falo em diversos eventos no Brasil.

O foco é em aplicações desenvolvidas com Ruby sob o paradigma de orientação a objetos. Aplicação de BDD e princípios como SOLID e “Tell, don’t ask” serão os principais objetivos.

Apenas para deixar claro, não tenho nada contra cursos. Apenas quero tentar uma nova abordagem que, enquanto mais “perigosa” para mim (o risco de dar de cara com situações que não conheço é alto), proporciona mais aprendizado para ambos os lados. Acredito que o time que me contratar se beneficiará muito da possibilidade de aprender enquanto desenvolve dentro de um contexto real, que enfrenta diariamente.

Horários

Não estou deixando meu trabalho atual. Por isso, meus horários disponíveis são de Segunda à Sexta das 19h às 22h e durante os Sábados. Isso limita os lugares aos quais posso ir, mas é o factível no momento.

Preços

Os preços serão de acordo com duração, tamanho das equipes e porte da empresa. Entre em contato comigo através do e-mail lucashungaro@gmail.com e vamos conversar. Tenho certeza que o custo ficará bem inferior ao de contratar uma consultoria de desenvolvimento e o benefício será bem maior.

Contato: lucashungaro@gmail.com


Capistrano and whenever: updating the crontab of the runner user

When deploying Rails applications with Capistrano it’s a common practice to use two separated users: a deployer (the user who actually does the deploy process, copying files and all that) and a runner (the user that runs the application on the server).

If you need cronjobs you probably use the whenever gem. It’s an awesome tool to configure your scheduled jobs with a nice and easy DSL. It also has built-in integration with Capistrano, but there’s a caveat: it will update the crontab of the deployer, not the runner‘s one.

To solve that issue, I’ve dropped the “automatic” integration (just a simple require “whenever/capistrano”) and used a hook to invoke whenever passing a user option to specify which user’s crontab to update. Here’s the relevant code:

after "deploy:update_code" do
  run "cd #{release_path} && #{try_sudo} GEM_HOME=/opt/local/ruby/gems RAILS_ENV=production bundle exec whenever --clear-crontab #{application} --user #{runner}"
  run "cd #{release_path} && #{try_sudo} GEM_HOME=/opt/local/ruby/gems RAILS_ENV=production bundle exec whenever --update-crontab #{application} --user #{runner}"
end

The code above sets some env vars for sanity sake and runs whenever specifying the runner user as the crontab owner.

There’s another small tweak you’ll need. On your schedule.rb file, add the following code on the very first line:

env "PATH", ENV["PATH"]
every 10.minutes do
  # ...
end

This will avoid nasty path-related errors (the cronjobs won’t find the gem’s bins and all that). And… that’s it! Have fun! :)


Compilando uma versão local do Rails Guides

Para compilar uma versão local do Rails Guides, você pode fazer o seguinte processo:

1) Descubra qual o seu “gem path”, o local onde suas gems estão instaladas. No meu caso, o Rails está instalado diretamente no sistema e não utilizo rvm ou rbenv. Para encontrar essa informação, utilizei o comando “gem env” diretamente no terminal. Meu path é “/usr/local/lib/ruby/gems/1.9.1/gems/”.

2) Acesse o diretório da gem railties. Essa gem é como um “rails-core”, sendo o núcleo e o “hub” em que todas as outras gems que compõe o framework (e também extensões de terceiros) se registram para serem carregadas:

lucashungaro@IronMan:/usr/local/lib/ruby/gems/1.9.1/gems
$ cd railties-3.2.2/guides
 
lucashungaro@IronMan:/usr/local/lib/ruby/gems/1.9.1/gems/railties-3.2.2/guides (master)
$ gem install RedCloth
 
lucashungaro@IronMan:/usr/local/lib/ruby/gems/1.9.1/gems/railties-3.2.2/guides (master)
$ ruby rails_guides.rb
 
lucashungaro@IronMan:/usr/local/lib/ruby/gems/1.9.1/gems/railties-3.2.2/guides (master)
$ mv output ~/projects/documentation/rails_guides_3.2.2

Isso irá compilar os guias no diretório local “output”, o qual movemos para uma localização mais familiar. Não encontrei uma forma de mudar o diretório com argumentos na linha de comando. Você pode fazer isso se chamar o gerador via código, no entanto. O script aceita outras opções via linha de comando, como a opção de gerar guias para o Edge Rails ou versão Kindle, entre outras.

3) Ao término do processo, teremos os guias compilados em HTML no diretório indicado. Para acessá-los você pode criar um bookmark em seu browser ou utilizar um SSB. Prefiro a segunda maneira e, para isso, utilizo o Fluid (para encontrar alguns ótimos ícones visite esse grupo no Flickr. Basta criar uma nova aplicação e apontar para o diretório em que geramos os guias, iniciando pelo arquivo index.html.

Rails Guides com Fluid


iPhone/iPad: minhas aplicações favoritas

Simples e rápido, minhas aplicações favoritas para iOS:

  • Camera+: aplicativo para tirar fotos com opções adicionais (como controle de exposição separado do foco) e efeitos de pós-processamento.
  • Hipstamatic: provavelmente a app que lançou a moda de efeitos vintage em fotos. A mais utilizada hoje é o Instagram, mas ainda prefiro o Hipstamatic.
  • 1Password: pra quem utiliza a versão desktop, é uma grande mão na roda pra lembrar senhas quando o celular é tudo que temos à mão.
  • Dropbox: ótimo pra visualizar documentos e fotos.
  • Convertbot: sou fanboy da Tapbots e uso todas as aplicações dos caras. O Convertbot é um conversor de unidades com muitas opções disponíveis e uma UI fantástica.
  • Pastebot: múltiplas áreas de transferência no iPhone, com direito à operações sobre o conteúdo copiado (como efeitos sobre imagens ou tradução de textos). Além disso, com o Pastebot Sync, é possível copiar e colar conteúdos entre Mac e iPhone e vice-versa.
  • Tweetbot: cliente de Twitter da Tapbots. UI sensacional, gestures, filtros, possibilidade de usar listas como timeline principal e várias outras opções.
  • Weightbot: aplicação para acompanhamento de peso, com estabelecimento de metas, cálculo de IMC e gráficos de projeções (pra você ver se está no ritmo certo pra chegar lá).
  • Shazam: está num café e começa a tocar uma música boa, mas você não sabe o nome e/ou artista? Use o Shazam pra identificá-la. Uso bastante com trilhas sonoras de filmes também. :)
  • Kindle: leitor de e-books, se integra muito bem com o Kindle for Mac.
  • Reeder: ótimo leitor de feeds.

Hora dos jogos:

  • Angry Birds e Angry Birds Seasons: clássico. Ótimo passatempo pra longas esperas.
  • Cut the Rope e Cut the Rope: experiments: ótimo jogo que combina elementos de física e habilidade de raciocínio pra resolver os problemas.
  • Contre Jour: uma mistura de Angry Birds, Cut the Rope, Portal e outros jogos, com uma trilha sonora e visuais muito bons.
  • Rage HD: prévia do próximo jogo para consoles da id Software, um shooter muito bem feito.
  • Infinity Blade: provavelmente o jogo com gráficos mais poderosos no iOS, leva o device (e a bateria) ao limite. O jogo em si não é uma obra-prima, mas vale pelos gráficos.
  • Death Rally: corrida + destruição, power ups, jogo em estilo bem clássico com ótimos gráficos e controles.
  • Fruit Ninja: mais um jogo clássico e ótimo pra passar o tempo.
  • Civilization Revolutions: pra quem é fã da franquia, uma versão simplificada do Civ, dá pra fazer um jogo completo em pouco mais de uma hora.

É isso! :)


Gems “locais”, irb e Bundler

Gosto de algumas gems como o wirble, que adicionam algumas funcionalidades ao irb (e, por consequência, ao console do Rails). O problema é que, em projetos que utilizam o Bundler, fica complicado adicionar esse tipo de gem ao Gemfile, pois elas não são realmente dependências do projeto e nem todos gostariam de utilizá-las.

Como programadores costumam ser bem radicais (ainda mais com essa mania de ser “opinionado”), isso sempre gera discussões e atritos. Eu já penso que é mais fácil simplesmente buscar uma solução, e eis aqui uma: https://gist.github.com/1096494.

Colocando esse snippet no seu arquivo .irbrc, ao abrir o irb (ou console do Rails), todas as gems do gemset global do RVM serão colocadas no load path, podendo assim serem requeridas na sequência. Eu não costumo usar gemsets por projeto (uso apenas o Bundler, da maneira explicada nesse post), mas deixo o gemset global com algumas gems para esse fim. Meu arquivo .irbrc está disponível no GitHub.

Essa solução não é lá muito elegante, mas funciona muito bem para gems utilizadas no irb. Há algum tempo propus uma solução na lista do Bundler e recebi algumas sugestões, porém nenhuma me agradou (como, por exemplo, obrigar todo mundo que não quer as gems a usar a flag –without a cada bundle install). A discussão pode ser vista aqui. Até cheguei a fazer um fork do Bundler para implementar algum tipo de metadado para controlar isso, mas o código é bem complicado e acoplado, então deixei pra lá. ;)


← Anterior