You are currently browsing the archives for the ruby category


Página nova e contratações

Virei a página outra vez….

Ontem assumi como diretor de tecnologia da Urban Summer, uma agência digital bem bacana, que tem feito trabalhos incríveis para uma porção de clientes legais. E como de costume, cá estou eu procurando por gente boa para trabalhar no meu time.

Tenho algumas vagas em aberto, que ainda vou postar aqui com mais detalhes, mas de cara, urgente, urgentíssimo, estou procurando por dois desenvolvedores client-side, como uns dois anos de experiência mais ou menos, com bastante habilidade em:

  • Recortar imagem – você pega um PSD e faz a mágica para transformar em página web
  • HTML
  • CSS
  • JavaScript

Se souber programar “razoavelmente bem” em Python, PHP, C#.NET, Objective-C, Java ou Ruby, que beleza, isso conta ponto a seu favor. Mas se não souber, tudo bem, não tem problema; esse não é um requisito obrigatório.

Se você não tiver interesse, mas souber de um camarada que tem, indique! Eu ficarei grato. Ele, certamente, também ficará – talvez ele até lhe pague um café.

Aguardo contato em leandro@urbansummer.com.br.

Valeu!

slogger: lugar de mensagens de log é no Syslog

Uma coisa importante que aprendi na convivencia com os melhores sysadmins de Linux que já trabalhei (esse e esse, por exemplo) é que lugar de log é no Syslog – e se você não está fazendo isso, hummm, há uma boa chance de you’re doing it wrong my friend.

…and in The .NET World

A melhor prática para aqueles que trabalham com .NET é escrever log com o Event Log. Os melhores sysadmins de Windows que conheço estão sempre ligados (Nagios? Zabbix?) no Event Viewer.

Então, apesar deste post se destinar a Ruby/POSIX, fica a dica do Renato Lucindo – no final desse post – para a galera de .NET/Windows também.

Bem, como a biblioteca padrão do Ruby para escrever no Syslog não é lá muito amigável, resolvi facilitar um pouco as coisas e criei a gem slogger.

Dois exemplos rápidos

Antes de mais nada, installe a gem:

$ gem install slogger

Log simples:

slogger = Slogger::Logger.new "sample_app", :debug, :local0
slogger.info "A good info"
slogger.debug "A deep info"

Log com tempo de execução:

slogger = Slogger::Logger.new "sample_app", :debug, :local0
slogger.info "A really good info preceded by spent time" do
    # do something
end

Depois, claro, dê uma olhada no seu Syslog, para ver as mensagens “logadas”.

A lambuja

Se você estiver usando Sinatra, por exemplo, pode usar o middleware Slogger::Rack::RequestLogger em vez do famoso Rack::CommonLogger, que usa Logger (não que o Logger seja ruim).

configure do
  slogger = Slogger::Logger.new "sample_app", :debug, :local0
  use Slogger::Rack::RequestLogger, slogger
end

E a dica final

Ecoando a dica do Renato Lucindo: não seja ingênuo, log everything!!!

Tá esperando o que para começar a fazer a coisa direito?

jetty-rackup: rodando aplicações Rack no Jetty

Por conta de um projeto que está pintando no trabalho, que requer o uso de um conector escrito em Java, há umas duas semanas mais ou menos comecei a fazer novos testes com Jython, considerando fortemente uma solução baseada Python. Até publiquei uma aplicação boba usando Flask, só de exemplo, porque googlando não achei nada que não fosse com Pylons ou Django. Mas no final, Jython não pode preencher alguns requisitos e voltamos então para JRuby.

É aqui que entra o tema deste post.

Essa semana andei fazendo algumas contribuições em um projeto open source bem simples, mas igualmente interessante, que é o jetty-rackup.

O objetivo do jetty-rackup é rodar aplicações Rack no Jetty WebServer, sem ter que empacotá-las em arquivos WAR, o que é definitivamente excelente em ambiente de desenvolvimento ou quanto você quer fazer deploy orientado a git pull.

Tutorial de 1 minuto

Bem, para que o jabá seja completo, nada melhor do que um tutorial. Vamos escrever então uma aplicação Sinatra básica – ótima pedida para Web API.

1. Com Sinatra já instalado, crie uma aplicação – app.rb

require 'sinatra'

configure :development do
  Sinatra::Application.reset! # recarrega as rotas
  use Rack::Reloader          # recarrega arquivos
end

get '/?' do
  "hello"
end

get '/:message/?' do |message|
  "hello #{message}"
end

2. Com a aplicação criada, crie o arquivo rackup – config.ru

require 'rubygems'
require 'app'

set :run, false
set :environment, :development

run Sinatra::Application

3. Com o arquivo rackup criado, installe a gem jetty-rackup

$ gem install jetty-rackup

4. Com a gem jetty-rackup instalada, no diretório da aplicação criada, inicie a aplicação

$ jetty-rackup config.ru

5. Finalmente, com tudo pronto, teste com cURL e Apache Benchmark

$ curl http://localhost:9292/

$ ab -n 10000 -c 25 http://localhost:9292/

Voilà!

Agora, rode o último comando algumas vezes e observe a variação crescente de “Requests per second”. JIT Compiler for the win!

Um pouco mais

Se quiser saber como usar bibliotecas Java, no repositório do projeto tem também um exemplo usando classes Java, tanto contidas no diretório WEB-INF/classes quanto em arquivo JAR no WEB-INF/lib.

Divirta-se!

A Locaweb está contratando!

A Locaweb está procurando por desenvolvedores experiêntes e talentosos para integrar nossos times de SaaS, Cloud Computing, Hospedagem, Q&A e Sistemas Centrais.

Se você tem experiência em Ruby, Python, Java, .NET, PHP, Perl, bancos de dados relacionais e não-relacionais, arquiteturas distribuídas, sistemas de agendamento de tarefas, filas assíncronas, desenvolvimento web, e umas coisinhas mais, pode ser que tenhamos um lugar aqui para você. Que tal?

O perfil completo pode ser visto na integra aqui, no OndeTrabalhar.com.

O quanto realmente importa a escolha de uma linguagem?

Há alguns meses perguntaram ao Rich Hickey:

“How much does a choice of language really matter? Are there good reasons to choose one language over another or does it all come down to taste?”

E sua resposta foi:

“I think it matters quite a bit. A good language is opinionated, and strives to make a particular style of programming easy and idiomatic. It only seems a matter of taste when you are comparing languages that are more similar than they are different, like Java/C# or Python/Ruby. Try something really different like Clojure, Haskell, or Erlang and the fact that it matters becomes readily apparent.”

Eu acho que concordo bastante com sua opinião. Discutir se Java é melhor do que C#, por exemplo, é inútil, porque as duas linguagens são muito semelhantes. Nesse caso, o que acaba pesando mais na hora da escolha é o ecosistema no qual cada linguagem está inserida, que pode agradar mais a um ou a outro programador. É puro gosto.

O mesmo vale para Ruby e Python, como ele mesmo cita.

Mundos diferentes

Mas e se a comparação for entre Java e Ruby, por exemplo, como é que fica? Na minha humilde opinião, fica no sense. Porque Java e Ruby não são liguagens de mesma proposta; e mesmo sendo ambas de propósito geral, ambas tem objetivos claramente diferentes.

Comparação entre mundos diferentes

Agora vou, propositalmente, contradizer um pouco o que eu disse à cima: faz sentido, sim, você comparar Ruby com Java; Erlang com Python; F# com PHP. Sim, faz sentido.

Faz sentido quando você está escolhendo a linguagem que oferece a melhor solução para um dado domínio de problema.

Super CRUD com Erlang? Não, acho que não.

Precisar de concorrência massiva, tolerância a falhas, processos distribuídos, downtime mínimo? Humm, não sei não, mas será que não é de Erlang que você precisa?

Entende? É nessa hora que a escolha de uma linguagem começa a pesar de verdade. Isso realmente importa.

Mundos diferentes se complementam

Tempos atrás, escrevendo programas Erlang/OTP, senti falta de uma ferramenta que me ajudasse a criar rapidamente a estrutura inicial do projeto e umas coisas mais. O que fiz? Criei uma ferramenta que faz isso: otp_kickoff. Em Erlang? Não, em Ruby. Fiz isso em poucas horas, usando Thor.

Pouco tempo depois, senti falta de uma ferramenta de build amigável. Novamente, o que fiz? Criei o ebuilder, usando Ruby/Thor.

Um outro exemplo de mundos diferentes que se complementam é o JSparrow, um cliente de JMS bem fluente, que fiz usando JRuby.

Essa é a ideia de tirar o melhor de cada linguagem!

Mesmo porque, dificilmente, você constroi um sistema de verdade – que não seja um super CRUD – com apenas uma única linguagem de programação. Na minha equipe mesmo, há sistemas desenvolvidos em C# .NET, que são buildados, testados e deployados com Ruby/Rake/Cucumber e usam Java/Ivy como repositório de assemblies. Isso sem falar em JavaScript, que também tem de monte.

Esse é o mundo real dos sistemas de verdade.

Moral da história

Isso me faz pensar que brigas de fanboys de linguagens – em frenéticas buscas por prosélitos – são uma verdadeira piada.

Geração e build de projetos Erlang/OTP

OK. Hora do jabá…

Há alguns meses, quando comecei a mexer mais com Erlang/OTP, senti a necessidade de ter uma ferramenta que gerasse a estrutura dos projetos, bem como stubs dos módulos necessários. Não encontrei nenhuma que fosse realmente simples. O que fiz? Cocei minha própria coceira, crie o projeto otp_kickoff.

Agora, de saco cheio desconfortável de usar Make para automatizar tarefas de build, resolvi coçar minha própria coceira novamente, crie o projeto ebuilder.

Se você também está mexendo com Erlang/OTP, sugiro que dê uma olhada nestes projetos, quem sabe eles também não facilitam sua vida, ahmmm?

A Rails Rumble foi demais!

Se eu tivesse que descrever a minha impressão sobre a Rails Rumble em uma frase apenas, certamente, eu usaria o título deste post, porque pra mim, a Rails Rumble foi demais mesmo.

Não ganhamos a competição, mas ganhamos muito participando da competição. Aprendemos muita coisa, fizemos amigos, nos divertimos bastante e fizemos umas das coisas que mais gostamos de fazer: programamos pra caramba! – dormi aproximadamente 5 horas durante as 48 horas de competição.

Meus sinceros agradecimentos à galera do meu time: Anderson Leite (com quem pareei bastante), Rafael (que foi quem teve a brilhante idéia do projeto) e Douglas (o melhor sysadmin que eu conheço). Foi muito bom fazer parte do time com vocês.

Nosso projeto

Bem, o resultado final do nosso projeto é este: whatannoysus.com. Não é tudo que nós gostaríamos que fosse, mas com certeza, já é um ótimo começo – e vamos dar continuidade.

Nós o construímos em menos de 48 horas, usando Ruby on Rails, Cucumber e MySQL; e o botamos para rodar num Ubuntu Server com Phusion Passenger e Nginx.

Patrocínio

Vida longa à Gonow! :)

A Gonow nos tratou muito bem, com tudo do bom e do melhor. Comida, camiseta Rails Rumble, hotel (que eu nem fui lá conhecer) e uma infra-estrutura de primeira.

Muito obrigado mesmo, a todos da Gonow e, se precisarem de alguma coisa, é nóiz!

Poder aos pares!

Tenho que concordar com o Yoshima, parear traz um ganho incrível no desenvolvimento. Ainda tem muita gente que acha que parear é reduzir o trabalho pela metada, afinal, são dois em um computador. Mas a real é que boa parte do nosso trabalho como programadores é pensar e conceber soluções que, em última instância, codificamos. E é aí que entra o ganho da programação em parte: duas cabeças pensam melhor do que uma – e quatro olhos acham bugs mais rápido também.

Outros relatos?

É isso que eu [resumidamente] tinha a dizer. Se você quiser saber um pouco mais, conhecer outros relatos, veja os posts do Anderson Leite e do Rodrigo Yoshima. E se houver algo que eu não mencionei e que você gostariam de saber, sinta-se à vontade para deixar um comentário.

Vou ficando por aqui e espero poder rever toda a galera – que foi muito legal conhecer – na Rails Summit.

Abraço!

Rails Rumble 2009: aqui vou eu!

http://www.gonow.com.br/rumble

Daqui a poucos minutos sairei aqui do meu trabalho em direção à Gonow para dar início à minha participação na Rails Rumble 2009, junto com meus camaradas @qmx, @r4f4el e @anderson_leite. A emoção está a mil, pode ter certeza!

Serão 48 horas de programação frenética, muita risada, descontração… e mais programação frenética — até o último git push.

Desde de já, quero agradecer demais a Gonow por todo apoio, que até camiseta e hotsite fez para todos fiquem realmente no clima da competição. Diego, valeu!

Torçam por nós!

@codezone
the_annoyers

5 minutos de CouchDB e CouchRest

Normalmente demoro um bom tempo para escrever um tutorial completo, mas dessa vez vou tentar ser o mais breve possível, tanto ao escrever, quanto no resultado final.

O tema é CouchDB, o revolucionario banco de dados orientado a documentos e com interface totalmente RESTful, e a Ruby gem CouchRest, que é uma verdadeira mão-na-roda. Obviamente que, em tão pouco tempo — até para cumprir a promessa inicial –, eu não vou explicar os fundamentos do CouchDB, mas você pode encontrar uma introdução interessante aqui.

A primeira coisa que você precisa fazer é se certificar de que possui Ruby e CouchDB instalados. Caso você ainda não os possua, no Google você encontra inumeras receitas para todo sabor de sistema operacional. No meu caso, estou usando Mac OS X com Ruby EE da Phusion e CouchDB instalado via MacPorts — que acho a maneira mais prática de instação de qualquer coisa; esforço zero.


$ sudo port install couchdb

De qualquer forma, se você quiser uma fonte rápida de informação sobre instalação do CouchDB no seu sistema operacional, consulte o apêndice do livro CouchDB: The Definitive Guide. Lá você encontra um guia rápido para instalação em Windows, Mac OS X, Unix-like e a partir do fonte.

Mão na massa

Bem, com todos os pré-requisitos OK, vamos por a mão na massa logo de uma vez!

1- Instale a gem CouchRest

$ sudo gem install jchris-couchrest

2- Inicie o CouchDB

$ sudo couchdb -b

Acesse http://localhost:5984/_utils. Se você viu um camaradinha relaxando num sofá vermelho no canto superior direito da página, é porque está tudo certo com seu CouchDB. Vamos em frente.

3- Abra um terminal IRB

require 'rubygems'
require 'couchrest'

Tudo requerido corretamente, hora de começar a brincar com nosso banco de dados. Mas antes, vamos criá-lo!

db = CouchRest.database!('http://localhost:5984/my_db')

Agora vamos criar os atributos do documento que será gravado nesse banco.

attributes = { "name" => "Leandro Silva", "blog" => "leandrosilva.com.br", "titles" => ["System Architect", "Blogger"]}

Criado os atributos do documento, vamos gravá-lo.

result = db.save_doc(attributes)

Documento criado! Você pode acessar novamente http://localhost:5984/_utils e ver o que aconteceu até agora. Há um documento criado no banco my_db, com uma revisão apenas, contendo os dados que definimos no hash attributes.

Você também pode acessar informações resultantes da operação anterior através do hash result.

result['id']
result['rev']

Viu? São as mesmas informações que você viu no gerenciador web do CouchDB.

Vamos continuar acessando estas informações [de maneira absurdamente fácil] através da CouchRest.

record = db.get(result['id'])

Veja o hash record. Há duas chaves particularmente interessantes: _id e _rev. Estas duas chaves são equivalentes a id e rev do nosso hash anterior, o result.

Um teste? Compare os resultados abaixo.

result['id']
record['_id']
result['rev']
record['_rev']

Taí, simples assim. Viu a equivalência?

Vamos ver outros campos do nosso registro.

record['titles']

Que tal adicionar mais um titulo?

record['titles'] << 'Polyglot Programmer'

Bem, acho que já é hora de salvar e ir adiante, porque este tutorial tem que ser breve. Vamos lá.

result = db.save_doc(record)

Outra coisa interessante aqui. Vamos conferir a chave rev do nosso hash result.

result['rev']

Diferente da primeira vez que vimos, não? Vá ao gerenciador web do CouchDB e veja se algo mudou. Sim, algo mudou. Agora você tem a opção de navegar pelas revisões do seu documento. Fantástico!

Legal, muito bem por hoje.

db.delete_doc(record)

Agora volte ao gerenciador web do CouchDB e dê um refresh na página de visualização — caso você esteja nela.

O que aconteceu? Sumiu! O registro foi apagado.

Finalizando

$ sudo couchdb -d

Bem, por hoje é só pessoal. Espero que tenha sido realmente útil e que vocês tenham gostado.

Ah! E se gostaram, please, me deem um pontinho lá no WWRails. =p

Quer saber onde será seu próximo trabalho?

Então não deixe de visitar…

O site é recém-nascido, mas já tem uns recursos bem legais, como sistema de pesquisa por palavras-chave, núvem de tags e entre outros. Vale a pena conferir e acompanhar sua evolução – e oportunidades de bons trabalhos.

Mais uma iniciativa bem interessante da Caelum. :)