AgileAndArt

The Art Improving Agile Software Development

Browsing Posts tagged ruby

Nessa vida de programador maluco
Me aparece cada situação
De repente um cliente, uma proposta bruta
Pra pegar de um site informação

Você tá louco, esse tipo de crime eu não faço
Se quiser tenho uns amigos lá do sul
Faz pra mim que eu te pago com essa jóia cool

Te dou um ruby
Pra você roubar
Com o seu robô

Quer fazer robô?
É só usar ruby
É só usar ruby
Pra fazer robô

Here are the slides the presentation slides about Ruby Robots I gave in RsOnRails

No próximo sábado teremos o primeiro DevOpsDays Brasil. O evento será gratuito e terá a presença de palestrantes importantes na área de Cloud e Infra-estrutura de Internet. Quem fará o Keynote do evento será John Willis – VP de serviços da Opscode, empresa que está por trás do software Chef – um dos mais bem feitos softwares de Configuration Management.

Além do Keynote no evento, John se ofereceu para dar um curso GRATUITO de Chef. Esse curso será na 6a. feira que antecede o evento – dia 3 de dezembro – no auditório fornecido pela Caelum. O curso apresentará os seguintes tópicos:

  • Uma visão geral sobre o Chef
  • O componente Cookbook do Chef
  • Integração de Sistemas com Chef

O curso fornecerá uma visão rápida do Chef e da plataforma Opscode. Para fazer o curso é necessário apenas conhecimentos básicos em administração de sistemas. Conhecimento em Ruby é um plus. Faça já a sua inscrição, pois as vagas são limitadas! Todos os participantes do curso ganharão um voucher de 1 mês grátis no Cloud Server Pro da Locaweb.

DevOpsDays

Algumas palestras que já estão confirmadas para o evento:

John Willis: Keynote: The Agile Enterprise, Devops and Clouds

No começo, TI era limitada pelo tempo que levava para provisionar e colocar no ar uma nova infra-estrutura. Porém, com o surgimento do Cloud, podemos montar – e desmontar – um datacenter vitual inteiro instantaneamente. Isso acelera o ciclo de tempo de TI. Isso é análogo a dois outros grandes passos tecnológicos: métodos ágeis de desenvolvimento de software e o movimento “devops” de arquiteturas auto-escaláveis e auto-configuráveis. Vamos ver como o destino da nuvem, código ágil e devops estão entrelaçados, e o que isso significa para os profissionais de TI.

Nessa sessão, John Willis (o co-apresentador dos famosos podcasts Devops Café e IT Management & Cloud) nos fará entender o que é Devops e como ele pode ajudar (ou atrapalhar!) você. Essa sessão dará uma visão pragmática sobre devops, esclarecendo como Devops se aplica para você e sua empresa.

Carla Souza: Automagicaly manage your configuration

Puppet é um software open source poderoso, flexível e extensível que consiste numa linguagem declarativa para expressão configurações de sistemas, além de um cliente e um servidor para distribui-la e uma biblioteca para perceber a configuração desejada. Nessa sessão, Carla Souza mostrará as funcionalidades do Puppet, os requisitos, como funciona e porque um sysadmin irá ama-lo.

Fabio Kung: Cloud e automação: tome o controle da sua infraestrutura!

Um dos principais conceitos trazidos pelo movimento DevOps é a automação de tudo que for possível na infraestrutura. Durante esse tempo em que venho desenvolvendo produtos de Cloud, juntei algumas ideias e possibilidades que gostaria de compartilhar.

Como algumas das principais ideias e serviços do que chamamos de “Cloud” podem ajudar? Como automatizar a infraestrutura? Como isso beneficia os meus sistemas? Como isso acelera a entrega de novas funcionalidades? E a escalabilidade? Performance? Confiabilidade?

Guilherme Silveira: Deploy contínuo: pois integração contínua não basta

Integrar continuamente é uma das primeiras práticas de engenharia de software defendidas por nós agilistas. Mas ser ágil é poder se adaptar rapidamente, requer feedback rápido, inclusive do cliente. Como colocar logo em produção? Em homologação? Depois de ganhar experiência, passamos ao próximo passo natural: automatizar os processos de deploy para homologação e produção, mas passamos por questões desde dificuldades com a infraestrutura até problemas de segurança de dados. Passando por aplicações pequenas, desktop, médias, web e grandes, veremos qual a importância de efetuar deploy sempre.

Outras atrações

Além dessas palestras, o DevOpsDays terá palestras relâmpago, OpenSpaces e painéis de discussão sobre o mundo devops.

Última receita

E para animar a semana, fiquem com o vídeo do Chef Diego Cukier – meu irmão – preparando incríveis pratos no restaurante Brooklin.

Monkey Patch é uma técnica de programação bem conhecida para modificar código runtime em linguagens dinâmicas (Smalltalk, JavaScript, Objective-C, Ruby, Perl, Python, Groovy, etc.) sem alterar o código fonte original. Programadores Ruby estão bem acostumados a criar novos métodos para classes já existentes. O Rails faz isso em várias classes do Ruby, por exemplo, adicionar o método to_xml à classe Hash. A maneira de fazer isso em ruby é:

  class String
    def meu_novo_metodo
       return self + "-> alterada"
    end
  end
  # "essa string".meu_novo_metodo retorna "essa string-> alterada"

Em Javascript, é possível adicionar um método a um protótipo (em Javascript não existe o conceito de classes como na maioria das linguagens orientadas a objetos). O código para adicionar um novo método em Javascript ficaria assim então:

   //cria o método "method" a todos os protótipos
   Function.prototype.method = function (name, func) {
      this.prototype[name] = func;
      return this;
   };
 
   //adiciona o método "integer" ao prototipo Number
   Number.method('integer', function () {
      return Math[this < 0 ? 'ceil' : 'floor'](this);
   });

Javascript não possui um método que remova espaços em branco no final de strings. Isso pode ser facilmente melhorado com o código:

   String.method('trim', function() {
      return this.replace(/^\s+|\s+$/g,'');
   });
 
  //"    teste    ".trim() retornaria "teste"

É muito fácil escrever um programa em Ruby para importar todos os seus contatos do Google na sua conta de e-mail Marketing da Locaweb. Com um simples script de 25 linhas isso é possível. Veja:

EMAIL_MKT_CHAVE = "[SUA_CHAVE]"
GOOGLE_EMAIL = "[SEU EMAIL NO GOOGLE]"
GOOGLE_PASSWD = "[SENHA GOOGLE]"
EMAIL_MKT_HOST = "[MAQUINA EMAIL MKT]"
EMAIL_MKT_LISTS = "11115"
EMAIL_MKT_LOGIN = "[LOGIN EMAIL MKT]"
EMAIL_MKT_URL = "http://#{EMAIL_MKT_HOST}.locaweb.com.br/admin/api/#{EMAIL_MKT_LOGIN}/contatos/importacao/?chave=#{EMAIL_MKT_CHAVE}&amp;listas=#{EMAIL_MKT_LISTS}"
 
login = {:accountType => "HOSTED_OR_GOOGLE",
	              :Email => GOOGLE_EMAIL,
	              :Passwd => GOOGLE_PASSWD,
	              :service => "cp",
	              :source => "danicuki-teste-1"
	             }
a = RestClient.post("https://www.google.com/accounts/ClientLogin", login)
auth = {"Authorization" => "GoogleLogin auth=#{a.split.last.split("=")[1]}"}
c = RestClient.get("https://www.google.com/m8/feeds/contacts/default/full?max-results=2000", auth)
contacts = Hash.from_xml(c)["feed"]["entry"]
emails = contacts.select {|c| !c["title"].blank?}.select {|c| !c["email"].blank?}
email_mkt_hash = emails.map do |c|
	{:nome => c["title"].split[0].camelize, :email => (c["email"][0] ? c["email"][0]["address"] : c["email"]["address"])}
end
RestClient.post(EMAIL_MKT_URL, email_mkt_hash.to_json)

Agora a descrição dos passos do código:

  1. Primeiro você define todos os parâmetros para a sua busca. Os dados sobre a sua conta de e-mail Marketing podem ser obtidos na documentação da API da Locaweb.
  2. Depois faz um post para obter a credencial do google, que será usada logo mais para buscar os contatos. A credencial é retornada em formato texto, uma string bem feiona tipo essa: SID=DQAAAJcAAAAGD-h4PWkAfqRPrDJcIVmiPg1qq1pDPCbY-1DykHzaSmxrpIqIYjUNdqYUjDgLJRmKZstgafFhHa0CIajl-SIlAKPLr2Ll-wuQhC5z-DFQ66mybDfiPlig5osdQ-Uf6JlFdfHGnKiQk4xfqHvg3xm0SFqwg2SQDIBXI-iidkkIjnS7F4Z8FYVP_bGj_26JYr7S6FTA3jNxiUS7QewUsk7d
    LSID=DQAAAJkAAAAPZxYEjHLtrIT6pO-E7hVvM_1khNV7FWfdsr1BMjqwHmfuuabdMSPwv9gHBvd8eHiO8lrMv2ugwGFB7eKxe5WiNQ_uBy3u9aOy8jrqCT_Gx_LRSEE2gyvX8aiGtdpLCiGxTjhCRz5S-wz2g4Qo6uwt-Rdh3xgocPEvSQeiF1Eqr5N5c8_eN0Kn-Gr6WBIsFm6mlyZqUKLSuROK1rL7WpMu
    Auth=DQAAAJkAAAAPZxYEjHLtrIT6pO-E7hVvM_1khNV7FWfdsr1BMjqwHmfuuabdMSPwv9gHBvd8eHh4LIFHdmGkr75M6OHTAjZf3T4n2Q8GwqyAu5G73NA9dnkDbC3q-AsdnZOV7eP6uSF_jhvZYrGmOzAARthZ9BCcmaz2y2eWCUdYzUE0vdNDgYlhAh2ybT21M4KHXFP5T6JfXN8wZVrVEiWhcaqP2MfI

    Para a chamada a API, a única coisa que interessa nessa string é o valor de Auth, que extraímos com o código

    a.split.last.split("=")[1]
  3. A API do Google Contacts é bem simples, porém o XML que ela retorna é um trambolho. Nesse momento estamos interessados em apenas montar um hash com o primeiro nome da pessoa e o e-mail. Fazemos isso nessas linhas:
    #contacts conterá um array de contatos
    contacts = Hash.from_xml(c)["feed"]["entry"]
    #filtra apenas contatos que tenha nome e email definidos
    emails = contacts.select {|c| !c["title"].blank?}.select {|c| !c["email"].blank?}
    #monta o hash - o nome é apenas a primeira parte do titulo 'camelized'
    # o email tenta o campo 0, se tiver coloca, senão é o próprio address (chatices...)
    email_mkt_hash = emails.map do |c|
    	{:nome => c["title"].split[0].camelize, :email => (c["email"][0] ? c["email"][0]["address"] : c["email"]["address"])}
    end
  4. Por último transformamos o hash em JSON e enviamos para o Web Service do Email Marketing.

Sexta-feira dessa semana acontecerá o Oxente Rails, o maior evento de Rails do Nordeste do Brasil. O evento será em Natal e terá a presença de pessoas importantíssimas da comunidade Rails, não só do Brasil, mas do mundo todo. Veja a lista de palestrantes. Alguns deles são: David Hanson (criador do Rails), Fábio Akita (evangelista de Rails no Brasil), Vinicius Teles da ImproveIT, Fabio Kung. A abertura do evento será feita pelo Aldinho (irmão de Elomar). Com certeza esse será um dos grandes eventos do ano.

Eu vou para o Oxente Rails, onde apresentarei a palestra Pensamento e Aprendizado Ágil. Também estarei lá para bater papo com todo mundo, falar de Rails, Ruby, Agilidade e outras coisas nerds. E conforme prometido no vídeo abaixo, cantarei AO VIVO o forró do Elomar! Não perrrrrrrrrcam. A gente se vê lá, bixim danado, cabra da péxti!

Jango.com is one of the most incredible on-line radios I know and some time ago I decided to put Daniella Alcarpe songs on this site. Jango has many things that make artists life happier and easier: you pay Jango to play your songs to people who probably will like your song. For example, Daniella sings Brazilian Bossa Music, so in Jango I choosed to play her songs just for people who like this kind of music, people who listen to João Gilberto, Caetano Veloso, Chico Buarque and so on.

After songs starts playing, the artist starts to get fans. And they really come! With just 2 months of Jango, Daniella has almost 400 new fans, from all over the world.

Now comes the coolest part: we can interact with these fans. They can send us messages, comment on our profile, send us feedback and we can send them messages too. This is awesome and very useful for an artist who is becoming her artist life.

Jango website was made in RubyOnRails, so they provide an API for people who wants to use Jango information on their own website. And that’s what I did, in an extremely easy way. I wanted to show in Daniella’s website recent comments from fans on Jango. It took 18 minutes for me to integrate these two websites, using Rails ActiveResource. Here’s what I did:

1 – I’ve created two models (models/user.rb and models/comment.rb) on my project, one to deal with Jango Users and one to deal with Jango Comments:

class User < ActiveResource::Base
   self.site = "http://www.jango.com"
end

class Comment < ActiveResource::Base
  self.site = "http://www.jango.com/artists/48343/"

  def user
     @user ||= User.find(user_id)
  end
end

2 – Then on my SocialController I have this:

class SocialController < ApplicationController
  def index
    @comments = Comment.find(:all)
  end
end

3 – And in my views/social/index.html.erb I have

<% @comments.each do |c| %>
  <%= link_to "#{c.user.first_name} (#{c.user.country})", "http://www.jango.com/users/#{c.user.id}" %>
  <%= c.body %>
<% end %>

And that’s it: 9 model lines of code, 5 controller lines of code and 6 view lines of code. With 18 lines of code, I’ve integrated Daniella Alcarpe website with Jango. This is the power of Rails and RESTful. Now everybody who visits www.cantora.mus.br can see what fans are saying about the singer and her wonderful work. Check for yourself.

PS: of course there are some cache stuff to deal with on this integration, but for now I’m not worried. Premature optimization is the root of all evil (Donald Knuth)

Switch to our mobile site