26/07/2010 em AkitaOnRails.com

Galera do #HoraExtra manda ver no #FISL

Porto Alegre estava com o clima frio, bem frio, mesmo assim nossos grandes amigos cariocas do #HoraExtra não deixaram de esquentar o show no #FISL. Coisas que só acontecem quando você está se divertindo: eles tiveram a idéia de, em vez de ficar assistindo palestras, por que não codificar? Codificar qualquer coisa sempre é exercício, e exercitar é essencial para não definhar.

Eu não participei da codificação mas a idéia foi inspiradora porque me bateu uma grande nostalgia. Quando começamos a programar, começamos porque gostamos. Programar sempre foi algo divertido, descompromissado, desafiador, não importa se é útil, não importa se é bonito, não importa se é completo. Mas com o passar do tempo nós nos “profissionalizamos” e de repente programar passou a trazer várias preocupações: “mas tem utilidade?”, “mas pra fazer completo dá trabalho”, “mas tem que planejar antes”, “mas vai custar caro, ou demorar muito”. Vários “mas”, “mas”. E aí programar já não é mais divertido.

Por isso essa idéia trouxe de volta um pouco desse espírito. Por que não escrever e publicar aplicativos pequenos, só pela diversão de fazer algum código? Foi assim que durante os 4 dias do #FISL eles publicaram nada menos do que 6 aplicativos, uma média de 1.5 aplicativos por dia! E para isso não foi preciso muita coisa: bastou juntar 3 ou 4 pessoas numa mesa, criar um repositório no Github e depois fazer deployment no Heroku, tudo hiper simples.

A premissa é que as aplicações eram simples, faziam apenas uma coisa da forma mais simples possível. Na média não se levava muito mais do que 4 horas para fazer cada aplicação. Graças ao Heroku com literalmente um simples “git push heroku master” a aplicação ia pro ar, sem gastar horas de configuração e administração de um servidor. Ou seja, graças às ferramentas criadas pela comunidade Ruby on Rails, existe praticamente atrito zero para colocar uma aplicação no ar. Foi um grande showcase dessas ferramentas também.

Eu não vou descrever o que cada aplicativo faz porque como eles são bem simples a própria descoberta faz parte da experiência, então apenas cliquem nas imagens para abrí-las:

Os repositórios de cada projeto no Github são:

Tanto no Github quanto no Heroku, se o projeto é open source e aberto, você não paga nada. Então, vejam o código desses projetos para começar e colaborem! Basta fazer um Fork, corrigir um erro de português aqui, acertar um CSS ali. Não existe contribuição pequena.

Boa diversão!


Gostou deste artigo? Considere fazer uma doação a este site.



24/07/2010 em Simples Ideias. Por Nando Vieira.

Criando sua própria RubyGem

Todo mundo já deve ter usado pelo menos uma vez na vida as famosas gems. Elas ajudam muito na hora distribuir e usar bibliotecas Ruby, sem dúvida nenhuma. Mas o que nem todo mundo sabe é que criar uma gem é muito mais fácil do que parece. Neste artigo você verá como criar e distribuir [...]

23/07/2010 em AkitaOnRails.com

Não percam minhas palestras no FISL 11

Pessoal, por demora minha acabou não saindo a descrição das minhas palestras na programação impressa do FISL. As duas serão no sábado, dia 24 (amanhã!), a partir das 11hrs da manhã. Me ajudem a divulgar!

A primeira será no auditório do Prédio 5 das 11h até as 13h. Lembrando que é um pouco afastado do prédio 41 principal então comecem a chegar cedo.

  • Ecossistema Ruby on Rails – Ruby on Rails é muito mais do que apenas um mero framework web MVC. Esse é apenas a ponta do iceberg. A parte mais importante é o ecossistema que se formou à sua volta, trazendo soluções completas em diversas áreas como deployment, e filosofias de empreendedorismo e desenvolvimento ágil. Para ser Ruby on Rails não basta ser apenas um mero framework, isso é muito trivial, a realidade é conseguir criar um ecossistema dinâmico e inovador. É sobre isso que vamos discutir nessa introdução ao Ecossistema Ruby on Rails.

A segunda será no auditório 41-C, no prédio principal, das 13h às 14h. Esta é no prédio principal e será logo em seguida da anterior, vou deixar um tempo para o pessoal poder se mover para o outro prédio. Outra coisa, logo em seguida da minha, na mesma sala 41-C será o mini-curso de Rails do Daniel V. Lopes, às 15h. Entre as duas haverá um slot vago e a organização permitiu que eu esticasse minha palestra para usar parte desse slot, dessa forma o pessoal já pode emendar as duas. Ou seja, será um hiper-combo de Ruby e Rails desde as 11h da manhã até as 17h!

  • Dicas de Desenvolvimento Web com Ruby – Muitas vezes as aplicações Web são lentas, pesadas. Se o desenvolvedor não tem experiência, uma das primeiras coisas que lhe vêm à cabeça é: “simples, o problema é a linguagem, vamos reescrever em outra mais rápida que tudo se resolve”. E isso nunca é verdade. O maior problema da lentidão de sites e aplicações é o entendimento pobre da arquitetura Web e suas alternativas. Esta apresentação tem como objetivo dar uma pequena introdução a esse problema e algumas soluções muito simples usando Ruby e Rails. As técnicas e conceitos demonstrados não são exclusivas de Ruby e podem ser aproveitadas em qualquer outra plataforma Web.

A minha primeira palestra é mais dedicada a quem está começando a tentar entender Ruby e Rails, mas mais do que código o importante é entender o contexto, a comunidade, as opções. Já a segunda é para quem é desenvolvedor. Esta é boa para quem ainda não começou para ver soluções práticas mas também para quem já está desenvolvendo e quer aprender novas técnicas. Ou seja, a primeira será mais conceitual, apresentando os conceitos importantes para começar bem com Ruby e Rails e a segunda será mais prática e técnica. Espero ver todos nas duas e também no mini-curso do Daniel em seguida :-)

E mais uma vez, como a programação impressa está desatualizada, por favor ajudem a divulgar! Valeu!


Gostou deste artigo? Considere fazer uma doação a este site.



19/07/2010 em AkitaOnRails.com

[Screencast] Começando com Vim

Antes de mais nada, para que ninguém fique preocupado, entre este screencast e o anterior eu não fiz nenhum post “normal” do blog, mas em breve os conteúdos de sempre, sobre Ruby, Rails, agilidade, os Off-Topics, irão retornar.

Este episódio é uma introdução ao venerado editor de textos Vim para quem ainda não tinha visto ou estava apenas começando e precisava de um “empurrão” para seguir adiante. Agora não há desculpas!

R$7.99
  • Nível: Iniciante
  • Tema: Começando a usar o editor de textos Vim
  • Duração: 2:03h
  • Formatos:
    • Maior: 800×600 – 405mb (zip, Quicktime/H.264)
    • iPhone: 480×360 – 393mb (zip, Quicktime/H.264)
  • Plataformas: Linux (Ubuntu), Mac OS X e Windows 7
  • Este screencast usa meu pacote de vimfiles que é open source também
  • Pré-requisitos: ter assistido o começo do screencast anterior ou já ter Ruby instalado e, se for usuário de Mac, já ter Homebrew instalado.
  • Acompanha PDF com os slides usados na apresentação
  • Tem organização em Capítulos
  • Pós-requisito: durante o episódio eu menciono “Expressões Regulares”, mas como é um tema fora do escopo, caso não conheça, recomendo começar com este artigo do Aurélio Jargas sobre o assunto.

E assista ao Preview:

Vim é um dos editores de texto mais antigos no mundo Open Source. Considerado por muitos como “difícil demais para aprender” ou “antigo demais e obsoleto” este screencast vai mostrar que, muito pelo contrário, Vim é um editor completo, robusto, estável, sofisticado e versátil e ainda totalmente apropriado para os desenvolvedores mais exigentes.

Usando Vim

Apesar de existir ótimos editores e IDEs no mercado, o Vim não deixa nada a desejar e ainda oferece mais opções. Este screencast usa meu pacote customizado de vimfiles para facilitar a iniciação e tornar a introdução aos iniciantes mais agradável.

Eu mesmo comecei a usar Vim – ou melhor, o anterior Vi – em 1995. Mesmo assim nunca investi muito tempo em aprender mais do que o básico dele. Mas só esse básico se mostrou importante toda vez que precisei entrar num servidor via terminal e o único editor decente disponível era o Vi.

Por alguma razão inexplicável, há alguns meses o Vim começou a retornar com mais força. Pude notar isso desde que comecei a brincar com o pacote de vimfiles do scrooloose em Janeiro de 2009 e resolvi derivar o meu próprio (cuidado: o post desse link está defasado). Vi que o interesse sobre esse pacote foi grande desde o começo.

Apesar de existir diversos tutoriais de Vim, desde básico até avançado, por toda a blogosfera, não é fácil para alguém que nunca “viu” entender como funciona o Vim. A pessoa sempre fica mais empolgada quando tem a chance de ver alguém realmente usando. É quando “cai a ficha”, literalmente. Por isso faz alguns meses que eu planejo fazer um screencast a respeito, para dar esse efeito de “ver o Vim atrás dos ombros de alguém” e possivelmente dar o empurrão que falta a muita gente que quer aprender mas não sabe exatamente por onde começar.

A boa notícia é que ao contrário do que muitos pensam, Vim não é uma coisa só para Linux. As versões de Windows funcionam perfeitamente bem e nesse screencast também mostro como instalar nele. Portanto o Vim é um editor quase universal. No Mac muitos já devem ter ouvido falar do Textmate, mas todo screencast que eu faço com ele não soa tão bem para quem usa Windows ou mesmo Linux. Pretendo usar apenas Vim quando fizer outros screencasts e isso deve diminuir um pouco a barreira para os não-usuários de Mac.

Além disso, só soube hoje pelo tweet do @paulojeronimo (sorry pela ignorância) sobre outro projeto, o vimbook, um manual de Vim, open source, em português escrito por usuários de Vim de longa data, alguns deles já bem conhecidos da nossa comunidade brasileira de Ruby como o Eustáquio Rangel e o Willian @pothix Molinari, do Guru-SP. Esse manual vai facilitar seu aprendizado de Vim.

E para quem entende inglês, eu também recomendo comprar os screencasts Smash into Vim que o Peepcode lançou recentemente em parceria com o Andrew Stewart. São dois episódios muito bem feitos.


Gostou deste artigo? Considere fazer uma doação a este site.



12/07/2010 em AkitaOnRails.com

[Screencast] Entenda Software da Maneira Correta

Atualização 12/07: Otimizei os vídeos e os tamanhos caíram de 1GB para 214MB. A versão iPhone ficou com 156MB. Quem já comprou pode baixar novamente usando os mesmos links que receberam por e-mail. A vantagem é que a qualidade é praticamente a mesma, mas com peso muito menor.

Esta é a gravação em forma de screencast da palestra que ministrei esta semana na USP sobre o tema “Entenda Software da Maneira Correta”, no evento Wire 2010.

O mundo de TI está cheio de processos, metodologias, consultorias, certificações, MBAs, mestrados, etc e ainda assim é comum ver projetos de software sofrendo para saírem com qualidade. Por outro lado, temos milhares de programadores, muitos hobistas, voluntariando para criar software sem coordenação central, saindo com código de alta qualidade que muitos dependem no dia a dia, desde Linux até Firefox.

R$4.99

Dentro dessa premissa, assista este screencast para saber o que Open Source, Darwin, Galvão Bueno e até Dwayne “The Rock” Johnson tem a ver com o modelo correto de desenvolvimento de software.

Parte deste tema eu discuti no meu outro blog, no artigo Processos, Metodologias e o Cérebro Humano e me inspirei também no paper de Ko Kuwabara, Linux: A Bazaar at the Edge of Chaos.

Quando o pagamento for confirmado você receberá um e-mail com o link para o download. O vídeo tem 214MB de tamanho em formato de 800×600 com 1h e 10min de duração. Acompanha versão em iPhone com 156MB em formato 480×360. Veja um Preview abaixo:

E se quiserem saber mais sobre este assunto e também ver como é o formato de uma palestra minha gravada como screencast, assistam a minha palestra “Desmembrando Pessoas”, que apresentei pelo Encontro Locaweb no começo do ano e coloquei gratuitamente aqui:

Primeiro Screencast Comercial do AkitaOnRails.com

Desde 2006 mantenho este blog para continuar sempre informando e criando material para a comunidade Ruby on Rails, e pretendo continuar fazendo isso.

Porém, muito desse conteúdo realmente me consome uma quantidade grande de tempo, em especial screencasts. Esta palestra, por exemplo, foi o trabalho de 3 dias ininterruptos, isso sem contar, claro, o tempo anterior de pesquisa.

Todo o conteúdo deste blog continuará gratuito como sempre foi, mas pretendo começar a criar mais screencasts, com mais qualidade de acabamento e com mais variância de temas, tanto para iniciantes que estão começando com Rails quanto técnicas avançadas para quem já é Railer. O modelo não é diferente do que o Peepcode ou o Envycasts fazem.

Este primeiro screencast é um experimento para saber qual a aceitação desta comunidade para este tipo de serviço. Inclusive gostaria de saber a opinião de vocês, sugestões, críticas e tudo mais que possa agregar para continuar melhorando meus serviços.

Espero que todos gostem.


Gostou deste artigo? Considere fazer uma doação a este site.



12/07/2010 em AkitaOnRails.com

[Screencast] Instalando um Ambiente Ruby

Finalmente, segue meu projeto de screencasts com o primeiro episódio Instalando um Ambiente Ruby.

R$7.99
  • Nível: Iniciante
  • Temas: Instalação do Ruby, RVM, Explicação de RubyGems
  • Duração: 1:10h
  • Formatos:
    • Maior: 800×600 – 288mb (zip, Quicktime/H.264)
    • iPhone: 480×360 – 223mb (zip, Quicktime/H.264)
  • Plataformas: Linux (Ubuntu), Mac OS X e Windows 7
  • Acompanha PDF com os slides usados na apresentação
  • Tem organização em Capítulos

E assista ao Preview:

Este screencast é destinado àqueles que querem começar com Ruby mas ainda não sabem bem como instalar um ambiente. Explico alguns dos fundamentos de Ruby como por exemplo o que é um $LOAD_PATH e como Rubygems são carregados e organizados. Mais: como criar uma Gem simples para entender os conceitos. Nos ambientes Ubuntu e Mac instalamos Ruby via RVM que é a forma mais moderna e flexível. Infelizmente não existe RVM para Windows, então mostro como fazer uma instalação simples. Este tutorial pode ajudar também quem já começou com Ruby mas não conhece RVM ou tem dúvidas sobre como Rubygems funcionam.

Feedback

Este é o meu primeiro vídeo neste formato, ainda estou tentando aprimorar então todo feedback é bem vindo para melhorar as próximas edições. E não deixem de usar o espaço de comentários também para discutir com os outros usuários deste blog e expandir nas técnicas demonstradas no screencast. Lembrando que mostro apenas algumas das técnicas mais básicas já que o foco é para Iniciantes.

Se tudo correr bem, quero continuar lançando screencasts para Iniciantes mas misturar temas mais avançados também, para quem já é Rubista. Sugestões de temas são bem vindos.

Além de tutoriais técnicos também quero continuar publicando minhas pesquisas na área de Agilidade e Gestão. E falando nisso, se ainda não comprou, não deixe de ver o screencast piloto desta série, que é a palestra Entenda Software da Maneira Correta.


Gostou deste artigo? Considere fazer uma doação a este site.



08/07/2010 em MouseOver Studio

Otimiza a comunicação na tua empresa com Shouty

Em poucas palavras, o Shouty é uma espécie de Twitter que nem o Yammer, Present.ly ou o Identi.ca, porém com muito menos funcionalidades. Faz um tempo, quando alguém na Gonow queria compartilhar alguma coisa simples com o resto da empresa, ela enviava um email para um endereço que inclui todos os membros da grande equipe. Esses [...]

06/07/2010 em AkitaOnRails.com

Usando ETAG e Memcached

Atualização 02/07/2010: Eu esqueci que o máximo de caracteres de uma chave de memcached é 250. Como estava gerando chaves dos posts usando os permalinks, obviamente em muitos casos vai dar mais de 250. Então o que eu fiz foi gerar as chaves normalmente, criar um digest SHA1 e truncar até 250. Isso deve resolver. Descobri isso porque estou usando o plugin exception_notifier e hoje comecei a receber dezenas de e-mails com a exception Memcached::ABadKeyWasProvidedOrCharactersOutOfRange. Fica a dica :-)

Aproveitando o episódio de ontem da lentidão do meu site, resolvi fazer um pequeno ajuste adicionando memcached à equação.

Recordando, eu estou usando ETAGs para economizar processamento. Leia meu artigo sobre ETAG para entender do que isso se trata. Basicamente a primeira vez ele vai ao banco, busca os dados, abre o template ERB, gera o HTML e envia de volta ao usuário, o caminho padrão. Com ETAG, na segunda vez ele checa que o dado no banco não mudou e devolve apenas um cabeçalho “304 Not Modified”, evitando o processamento do template ERB e transporte do HTML. Só isso dá uma boa acelerada na requisição.

Porém, eu gero o ETAG usando o campo ‘updated_at’, ou seja, eu preciso acabar indo ao banco e buscar essa informação. Algo parecido com isso:

1
2
3
4
5
def show
  @post = Post.find_by_permalink(*([:year, :month, :day, :slug].collect {|x| params[x] } << {:include => [:tags]}))
  etag = @post.updated_at.to_i
  fresh_when( :etag => etag, :public => true ) unless Rails.env.development?
end

O método find_by_permalink é específico do meu blog (veja o código do Enki para referência). Daí uso o método fresh_when para gerar o cabeçalho caso necessário. O ponto é: ele vai executar o find ao banco em todas as requisições. No caso que aconteceu ontem, com muitas requisições simultâneas, isso pode se tornar um ponto de contenção crítico, mesmo se a query for muito rápida.

Memcached

A solução mais simples que eu pensei foi em colocar o memcached na frente disso. Num Ubuntu para instalar o daemon basta fazer:

1
sudo apt-get install memcached libsasl2-dev

E no Mac, se você estiver usando o Homebrew, basta fazer:

1
brew install memcached

Daí precisa instalar a gem:

1
gem install memcached

Agora no config/environment.rb coloque:

1
2
3
4
  config.gem 'memcached'
...
end
require 'digest/sha1'

E no seu config/environments/production.rb coloque:

1
2
require 'memcached'
config.cache_store = :mem_cache_store, Memcached::Rails.new

Isso habilita o cache via Memcached. Em ambiente de desenvolvimento e teste, ele vai armazenar tudo em memória mesmo, e em produção vai usar o Memcached. Desde o Rails 2.3 o sistema de cache foi abstraído e você pode escolher diversos tipos de armazenadores como memória, arquivo, o próprio memcached e outros. Todos são gerenciados através de uma API única, a partir de Rails.cache.

Agora, basta fazer algo assim no controller:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
def show
  # Parte 1
  cache_key = Digest::SHA1.hexdigest("post_#{[:year, :month, :day, :slug].collect {|x| params[x] }.join('_')}")
  etag = Rails.cache.read(cache_key)
  options = { :public => true }
  if etag
    fresh_when( :etag => etag, :public => true ) unless Rails.env.development?
    options = {}
  end

  # Parte 2
  unless request.fresh?(response)
    @post = Post.find_by_permalink(*([:year, :month, :day, :slug].collect {|x| params[x] } << {:include => [:tags]}))
    etag = @post.updated_at.to_i
    Rails.cache.write(cache_key, etag, :expires_in => 1.day)
    fresh_when( options.merge(:etag => etag, :last_modified => @page.updated_at.utc) ) unless Rails.env.development?
  end
end

Existem 2 partes nessa lógica. Na primeira, montamos a chave do cache, que tem que ser única para cada elemento – no caso, um post – que você quer gerenciar. Em especial para meu blog eu monto uma chave baseada nos parâmetros que vem na requisição. Ou seja se o usuário mandar a URL “/2010/01/01/foo” ele vai montar a chave “post_2010_01_01_foo”. Daí ele faz um Rails.cache.read para ver se já existe um ETAG armazenado no memcached. Se já existir ele vai tentar chamar o fresh_when para ver se pode já só enviar o cabeçalho 304.

Na parte 2 ele checa request.fresh?(response). Se voltar falso quer dizer que o navegador do usuário mandou um ETAG diferente do que temos armazenado no memcached, ou seja, provavelmente o post foi atualizado. Então temos que mandar uma versão nova. Daí ele faz a lógica normal de procurar pelo post, gerar o ETAG. Daí ele grava o ETAG novo no cache, pra garantir, e também manda esse novo ETAG no cabeçalho de volta ao navegador. Da próxima vez, o navegador vai mandar o novo ETAG e daí vai receber de volta apenas o cabeçalho 304. Além disso também estou configurando o cabeçalho “Last-Modified” para facilitar o cache da página.

Um pequeno detalhe é a hash options. Logo na parte 1 notem que eu faço isto:

1
2
3
4
5
options = { :public => true }
if etag
  fresh_when( :etag => etag, :public => true ) unless Rails.env.development?
  options = {}
end

E mais abaixo eu faço isto:

1
options.merge(:etag => etag, :last_modified => @page.updated_at.utc)

Isso porque na implementação do método fresh_when tem um trecho que é assim:

1
2
3
4
if options[:public]
  ...
  cache_control << "public"
end

Ou seja, se eu chamar o método fresh_when múltiplas vezes com a opção :public => true, ele vai ficar adicionando na lista cache_control e daí no cabeçalho Cache-Control vai voltar uma string tipo public, public. Então, se o fresh_when já foi chamado no começo, na segunda vez eu tomo o cuidado de não passar o :public de novo.

Finalmente, no administrador de posts, eu invalido o cache caso eu atualize ou apague um post. Assim:

1
2
3
4
5
6
7
8
9
10
11
class Admin::PostsController < Admin::BaseController
  after_filter :clean_cache, :only => [:create, :update, :destroy]
  ...
  
  protected
  
  def clean_cache
    Rails.cache.delete(Digest::SHA1.hexdigest("post_#{@post.permalink.gsub("/", "_")}"))
    Rails.cache.delete("recent_posts_etag")
  end
end

No caso faço um after_filter que vai rodar só depois dos métodos create, update e destroy. No caso ele apaga o ETAG do post (método show do controller público) que tem aquele formato “post_2010_01_01_foo” (no caso eu criei um método chamado permalink no model Post que formata isso) e também deleta o ETAG no caso da página principal (que eu guardo com a chave recent_posts_etag), que busca vários posts. Eu assumo que se um post mudar, é melhor recriar a homepage inteira porque não sei se esse post aparece listado lá ou não. Poderia ter uma lógica melhor, mas considerando que eu não fico atualizando ou deletando posts o tempo todo, isso deve bastar.

Meu blog é bem simples, mas se o administrador fosse mais complexo e precisasse invalidar o cache a partir de múltiplos pontos, o melhor é criar um Observer que centraliza a lógica e invalidação do cache de ETAGs.

Sumarizando

Não é um processo complicado mas precisa entender direito para que serve um ETAG e como funciona um cache. O uso do cache em si é bem simples, basicamente você lê (read) ou grava (write) nele a partir do objeto Rails.cache. Agora o importante é saber quando você invalida esse cache.

Logo que o servidor sobe, o cache está vazio, então ele precisa ir ao banco o tempo todo para cada requisição nova. Porém, é só a primeira vez porque a partir de agora ele vai armazenar o ETAG gerado no memcached e depois de 1 dia ou menos, a maioria dos meus posts já estarão com suas ETAGs no cache. Então o MySQL vai basicamente ficar sentado sem fazer nada – que é o ideal.

Então, minha otimização fez duas coisas: na primeira versão, que só gerava e processava ETAGs, eu economizei o tempo de processamento do ERB e envio do HTML. Agora estou economizando comunicação com o banco de dados, o tráfego dos dados entre o banco e o Rails e a geração dos ETAGs em si. Ou seja, o Rails está fazendo muito pouco, praticamente só servindo como um roteador mesmo.

Isso baixou o tempo de processamento médio de uma requisição do meu Rails de uns 50ms, antes, para algo entre 7ms e 1ms!. Somado ao upgrade de memória de 512 para 768 MB de RAM e de 512 MB para 1 GB de swap, meu blog deve estar preparado para aguentar algumas ordens de grandeza mais tráfego simultâneo.


Gostou deste artigo? Considere fazer uma doação a este site.



06/07/2010 em AkitaOnRails.com

RubyConf Latin America derruba AkitaOnRails.com

Hoje à tarde tive uma das primeiras quedas do meu site por acesso concorrente. Não sei precisamente porque caiu, mas acho que tenho uma idéia. Para quem é curioso sobre infraestrutura, talvez fique interessado.

Para quem não sabe, desde fevereiro ou março eu mudei meu blog pra Linode. Contratei o menor slice deles, um de 512MB de RAM. Pra um blog deveria ser mais do que suficiente. Ele dificilmente consumia mais do que 450MB de RAM. Em termos de processamento também nunca foi pesado.

Porém hoje de manhã eu twitei sobre o RubyConf Latin America. Poucos minutos (ou segundos?) depois meu site estava devolvendo erros 502 bad gateway pra muita gente. Eu mesmo estava sofrendo lentidão para logar via SSH nele. Então, o que aconteceu?

Minha suspeita é meu uso de ETAGs, como eu comentei em um artigo anterior. A idéia do ETAG é que se os dados da página não mudaram, eu não preciso renderizar um novo HTML e reenviar para o usuário. Eu envio de volta um cabeçalho 304 Not Modified e isso economiza muito processamento. O problema é que para gerar a hash do ETAG de qualquer forma eu preciso fazer um roundtrip pro MySQL, para checar o timestamp no campo “updated_at” dos posts e aí gerar o hash. Ao ter muito acesso simultaneamente eu acho que começou a dar pico no uso de memória. Pra ter uma idéia meu swap estava zerado de espaço, causando thrashing. Esse era o resultado do comando “free” naquele momento:

1
2
3
4
             total       used       free     shared    buffers     cached
Mem:        368844     363404       5440          0        264       7484
-/+ buffers/cache:     355656      13188
Swap:       524280     524256         24

Para piorar, swap em ambiente virtual não é a mesma coisa que swap em disco físico real, tem muito mais contenção de I/O. Isso tornou as respostas lentas a um ponto insuportável. Entendido isso o que eu fiz foi dar um upgrade no meu slice e migrei minha máquina virtual da Linode para uma com 768MB de RAM e configurei um swap de 1GB. Imediatamente após o reboot tudo voltou ao normal. Agora o resultado do comando “free” está assim:

1
2
3
4
5

             total       used       free     shared    buffers     cached
Mem:        786636     725100      61536          0      18360     460804
-/+ buffers/cache:     245936     540700
Swap:      1048568          4    1048564

O tempo de resposta do meu servidor estava batendo médias de 5 seg a mais para cada requisição. Agora voltou ao normal de 40ms. Ou seja, no momento da lentidão o tempo de resposta tinha subido pra mais de 125 vezes! O problema nem era tanto CPU ou mesmo tráfego, mas quantidade de operações de I/O, contenção e thrashing, causado, provavelmente por falta de RAM/swap.

Claro, eu não gosto de otimização prematura, mas foi um caso de trocar o cert o pelo duvidoso. No meu caso, de um site de conteúdo, eu tinha implementado um processo de Cache Estático, ou seja, toda requisição na primeira vez renderizava o HTML e guardava localmente como um arquivo estático. Daí na segunda requisição ela nem precisava tocar na aplicação Rails, pois o NginX poderia devolver diretamente o arquivo HTML. Isso teria segurado esse pico de hoje com tranquilidade, mas como eu estou usando ETAGs, há um processamento sendo passado pro Rails, mesmo que mínimo, a cada requisição, gerando a contenção. Talvez seja o caso de eu voltar a usar cache estático pra evitar esse problema.

Atualmente meu blog é uma versão (bem) modificada do Enki que é uma engine de blog minimalista. Eu mexi bastante nele, acrescentando coisas como suporte a cache estático (que dá um certo trabalho de manutenção, ao contrário de ETAG), inclusive retirando o código que dá suporte a comentários já que passei a usar o Disqus. No servidor eu uso um Ubuntu Server com o MySQL padrão que ele instala, mais firewall interno com iptables, e o Rails roda com Phusion Passenger (óbvio!) junto com o NginX como servidor Web. Normalmente tem só 1 ou 2 processos de Passenger rodando por trás, consumindo uns 88MB de RAM cada.

Como sempre, o que não escala não é o Rails e nem a aplicação, mas a arquitetura por trás. Para 99% do tempo um slicezinho mínimo da Linode é mais do que suficiente. Mas para aquele menos de 1% onde estoura um pico de acesso, ele pode engargalar. Recomendação: sempre ter recursos sobrando. Mesmo assim nunca dá para prever de quanto será o pico. Uma das grandes vantagens dos serviços de hospedagens como o da Linode (que é excelente, aliás) é a possibilidade de migração rápida. Ele levou menos de 15 minutos para migrar meu slice da máquina de 512RAM para de 768MB de RAM. Essa é a grande vantagem de se rodar em ambientes virtualizados. 10 anos atrás, ou mais, eu precisaria encomendar uma nova máquina física, passar por um processo de migração possivelmente manual (naquela época) e isso poderia levar pelo menos 1 dia inteiro. Agora, basta entrar no painel de administração e clicar um botão, literalmente.

A única coisa triste foi meu uptime de uns 4 meses (desde que contratei o serviço) ter zerado :-)


Gostou deste artigo? Considere fazer uma doação a este site.



05/07/2010 em AkitaOnRails.com

O que aconteceu com o Rails Summit?

Em 2007 realizamos um evento comunitário pequeno mas muito legal chamado RejectConf 2007, com o apoio do IME-USP, da Caelum, e muitos participantes que viriam a se tornar conhecidos na comunidade. Não lembro direito os números mas acho que foram umas 70 pessoas.

Em 2008 eu queria um evento grande. Por coincidência, ao mesmo tempo em que eu tentava contatar a Locaweb, ela me procurou. Acabei indo trabalhar lá e antes mesmo de pisar dentro do escritório eu já estava viajando para Portland para o RailsConf 2008, com o objetivo de fazer contatos e conseguir palestrantes. O evento foi batizado de Rails Summit.

A organização começou em Julho e o evento seria já em Outubro. Isso foi bem apertado. Mas o resultado foi um sucesso: mais de 550 pessoas, 2 dias inteiros, 2 sessões paralelas, mais de 20 palestrantes. Em 2009, com mais experiência, fizemos a segunda edição do Rails Summit. Foram excelentes eventos.

Finalmente, chegamos em 2010. Eu saí da Locaweb e muitos me perguntaram se o Rails Summit iria continuar. E a resposta é: o Rails Summit acabou …

RubyConf Latin America

… acabou porque em seu lugar vamos fazer a primeira RubyConf Latin America! Consegui parceria com a Ruby Central, que autorizou o uso do nome oficial em nosso evento e está nos ajudando com o conteúdo.

Já estamos confirmados para os dias 26 e 27 de Outubro deste ano, desta vez será no Centro de Convenções Frei Caneca, em São Paulo.

Depois de 2 anos de experiência conseguimos otimizar ainda mais os custos por isso desta vez o preço do ingresso será de apenas R$ 150. As inscrições começam em Agosto. Não haverá meia para estudante porque isso é desnecessário. Considerando que em 2008 o preço era R$ 400, podem ver que baixamos bastante. E ainda assim com o mesmo formato de 2 dias inteiros, 2 tracks paralelos, tradutores inglês-português e português-inglês, coffee-break, enfim, o pacote completo. A qualidade será mantida.

E a Locaweb continuará sendo a principal responsável pelo evento uma vez que já fizemos dois Rails Summit bem feitos, e eu não conheço ninguém que organize melhor. Então será “RubyConf Latin America, by Locaweb, co-presented by Ruby Central”.

Eu fui contratado como consultor, e junto com a Ruby Central vamos manter o nível de qualidade do conteúdo do evento. Por isso não precisam se preocupar.

Chamada para Propostas

Algumas empresas já confirmaram sua participação: Engine Yard, Github, Opscode. Até agora já temos os seguintes palestrantes: Charlie Nutter, Yehuda Katz, Evan Phoenix, Chris Wanstrath, Scott Chacon, Adam Jacob.

E a partir deste momento também está aberta a Chamada para Propostas. O processo será bem informal: se estiver interessado em palestrar no evento, envie quantas propostas quiser para meu e-mail, em fabioakita at gmail. Coloque os seguintes detalhes em inglês:

  • Nome completo
  • Empresa
  • Estado/Cidade/País
  • Pequena biografia (um ou dois parágrafos)
  • Título da Palestra
  • Descrição da Palestra

Preciso que seja em inglês porque provavelmente o David Black, um dos diretores da Ruby Central, vai me ajudar a selecionar as propostas caso venham muitas.

Como é RubyConf não se limitem somente a Ruby on Rails. Estou muito interessado em trabalhos para desktop, smartphone, bibliotecas, técnicas e assim por diante.

Reservem suas agendas, em breve teremos mais novidades!


Gostou deste artigo? Considere fazer uma doação a este site.



05/07/2010 em AkitaOnRails.com

What happened to Rails Summit Latin America?

Brazil went official in the worldwide Ruby on Rails conference roadmap with 2008’s “Rails Summit Latin America”. This was the very first big conference around Rails in the continent and a very successful one, gathering more than 550 attendees each year. We had more than 20 speakers, 2 full days, 2 parallel sessions with real-time translations.

Now, it is 2010, and I have decided that Rails Summit is no more …

RubyConf Latin America

… because it’s being replaced for the first edition of RubyConf Latin America! We managed to partner with Ruby Central, and they authorized the usage of the name.

We are already confirmed for October, 26th and 27th, this time at Frei Caneca Convention Center, in São Paulo, very near to the famous Paulista Ave. area.

After 2 years of experience we were able to optimize the costs even further, therefore the registration fee went down to BRL 150 (~ USD 78) with registration starting in August. We will maintain the same format with 2 full days of sessions, 2 parallel tracks, real time translation from English to Portuguese and Portuguese to English, coffee-break, the entire package. The quality will be the same.

Locaweb will keep on being the stewardship and main sponsor of the event. With 2 successful deliveries, I can’t think of a better partner. So it will be “RubyConf Latin America by locaweb, co-presented by Ruby Central”.

We just opened up a teaser website in Brazilian Portuguese at http://rubyconf.com.br but the complete site will be up soon.

Call for Proposals

Some companies already confirmed their participation in the conference: Engine Yard, Github, Opscode. So far we already have Charlie Nutter, Yehuda Katz, Evan Phoenix, Chris Wanstrath, Scott Chacon, David Black, Adam Jacob.

From now on, I am opening the Call for Proposals. As it is the first time I am doing this, it will be very informal. If you’re interested in participating send me an e-mail, to fabioakita at gmail with the following details:

  • Full name
  • Company
  • State/City/Country
  • Short bio
  • Title of the talk
  • Description of the talk

We will have more news soon! But you can already book flights to Brazil for the last week of October ;-)


Gostou deste artigo? Considere fazer uma doação a este site.



01/07/2010 em Nome do Jogo

“Eu quebrei o código”

No dia 9 de setembro de 1945 a equipe da Dr. Grace Hopper (que mais tarde se tornaria a criadora da linguagem COBOL) e de Howard H. Aiken estava diante de um problema na sala do computador Mark II. Depois de uma análise minuciosa detectaram uma mariposa entre os contatos de um dos relés do [...]

27/06/2010 em MouseOver Studio

Testa hoje teu código JavaScript numa aplicação Rails 3 com Blue Ridge

Caso queiram testar hoje seu código JavaScript numa aplicação Rails 3 de jeito bem simples, o Kristian Mandrup criou um fork do Blue-Ridge onde adaptou os geradores para a nova interface. Os commits dele ainda não foram adicionados ao repositorio oficial e o branch tem uns bugs leves, pelo que criei outro fork e corrigi [...]

16/06/2010 em MouseOver Studio

Testando Sinatra com RSpec

Recentemente a Gonow foi contratada para trabalhar num projeto que já tinha passado por outras duas consultorias com desenvolvedores bastante reconhecidos no mercado nacional. A aplicação foi construída sobre Sinatra e algo que me chamou muito a atenção é que a aplicação não tinha uma linha de teste. Mesmo não sendo uma justificativa, aparentemente não [...]

04/06/2010 em Nome do Jogo

Programadores: Nem sempre o time que está ganhando está ganhando

Estou sempre recebendo e-mails de pessoas interessadas em Ruby me questionando se realmente vale a pena gastar o seu tempo estudando essa linguagem de programação ao invés de estudar linguagens mais conhecidas como Java ou C#. Tenho certeza que a mesma dúvida preenche a mente de qualquer um que esteja interessado em apostar em alguma [...]

Página 1Página 2Página 3Página 4Página 5Página 6