Posts de July, 2009

[Tiago Peczenyj] Comportamento estranho do FakeWeb versões antigas

Thursday, July 9th, 2009

Ontem fomos surpreendidos por este comportamento estranho do FakeWeb (versões 1.2.2 e 1.2.3), de uma hora para a outra o corpo das requisições vinham como “” (vazio).

irb(main):001:0> require 'rubygems'
=> true
irb(main):002:0> require 'fakeweb'
=> true
irb(main):003:0> FakeWeb.register_uri(:get, 'http://google.com', :body
=> 'google')
=> [#<FakeWeb::Responder:0xb78290a8 @uri="http://google.com",
@options={:body=>"google"}, @method=:get, @times=1>]
irb(main):004:0> HTTParty.get('http://google.com')
=> nil
irb(main):005:0> x = HTTParty.get('http://google.com')
=> nil
irb(main):006:0> x.code
=> 200
irb(main):007:0> x.body  # deveria vir 'google'
=> ""
irb(main):008:0> Net::HTTP.get(URI.parse("http://google.com"))
=> ""  # mesma coisa... :/

Atualizando para versões mais recentes (como a 1.2.4) o problema acaba. Alguem mais passou por isso?

O FakeWeb é uma excelente ferramenta para testes reais onde dependemos da resposta de outros servidores. Ao inves de estabelecer uma comunicação real, que pode trazer outros tipos de problema de dificil detecção, simulamos a resposta para ver se o sistema se comporta de acordo com o esperado.

Sabe quando vc tem que testar se de 1, N, 0 elementos ou 404, essas coisas, e nem sempre vc pode forçar estas situações por ser complicado demais? Nesse ponto o FakeWeb é A ferramenta certa.

[Tiago Peczenyj] Comportamento estranho do FakeWeb versões antigas

Thursday, July 9th, 2009


Ontem fomos surpreendidos por este comportamento estranho do FakeWeb (versões 1.2.2 e 1.2.3), de uma hora para a outra o corpo das requisições vinham como “” (vazio).

irb(main):001:0> require 'rubygems'
=> true
irb(main):002:0> require 'fakeweb'
=> true
irb(main):003:0> FakeWeb.register_uri(:get, 'http://google.com', :body
=> 'google')
=> [#<FakeWeb::Responder:0xb78290a8 @uri="http://google.com",
@options={:body=>"google"}, @method=:get, @times=1>]
irb(main):004:0> HTTParty.get('http://google.com')
=> nil
irb(main):005:0> x = HTTParty.get('http://google.com')
=> nil
irb(main):006:0> x.code
=> 200
irb(main):007:0> x.body  # deveria vir 'google'
=> ""
irb(main):008:0> Net::HTTP.get(URI.parse("http://google.com"))
=> ""  # mesma coisa... :/

Atualizando para versões mais recentes (como a 1.2.4) o problema acaba. Alguem mais passou por isso?

O FakeWeb é uma excelente ferramenta para testes reais onde dependemos da resposta de outros servidores. Ao inves de estabelecer uma comunicação real, que pode trazer outros tipos de problema de dificil detecção, simulamos a resposta para ver se o sistema se comporta de acordo com o esperado.

Sabe quando vc tem que testar se de 1, N, 0 elementos ou 404, essas coisas, e nem sempre vc pode forçar estas situações por ser complicado demais? Nesse ponto o FakeWeb é A ferramenta certa.

[Tiago Motta] Globo Vídeos: Quem viu este vídeo também assistiu

Thursday, July 9th, 2009

É com muito orgulho que anuncio que acaba de sair para degustação uma nova funcionalidade do Globo Vídeos. Foi uma alteração que durou apenas um dia de desenvolvimento envolvendo o time inteiro e que ficará no ar por um tempo ainda em versão de teste. Trata-se de uma forma de ofertar vídeos baseada nas preferências de nossos usuários. Chamamos a funcionalidade de “Quem viu este vídeo também assistiu”.

Como ainda está em versão “beta”, para visualizar a alteração é preciso ter o addon Grease Monkey instalado no seu Firefox, e instalar o script que habilita a funcionalidade beta. Depois basta acessar o Globo Vídeos para poder aproveitar a nova facilidade disponível. E se possível, nos dê feedback dizendo o que achou e se encontrou algum problema na utilização. A opinião de vocês é muito importante para que a gente possa melhorar.

[Tiago Motta] Teste de aceitação automático com múltiplas configurações no rails

Thursday, July 9th, 2009

Dado que uma aplicação possua duas maneiras ou mais de funcionar de acordo com alguns parâmetros de inicialização, como proceder com os testes de aceitação automáticos sem ter que iniciar e parar o servidor entre cada cenário ou grupo de cenários?

A solução simples, mas bem funcional que adotamos, foi ter uma task rake para inicializar vários servidores no ambiente local, cada um com um environment e uma porta diferente. Assim, ao testar uma determinada funcionalidade com determinada configuração basta acessar o servidor naquela porta.

A task rake que poderia até mesmo ser um shell script, ficou mais ou menos como mostrado abaixo. Créditos ao Tiago PacMan, mestre em shell, que fez a linha que finaliza os servidores.

desc 'Inicia servidores para teste de aceitação'task "server:test" do  system 'RAILS_ENV=test_conf_1 script/server -d -e test -p 3001'  sleep 1  system 'RAILS_ENV=test_conf_2 script/server -d -e test -p 3002'  sleep 1  system 'tail -f log/test.log'  system "ps aux | awk '/3001/{print $2}' | xargs kill -9"  sleep 1  system "ps aux | awk '/3002/{print $2}' | xargs kill -9"  sleep 1end

Repare que para este caso fizemos uma modificação no environments.rb para unificar os logs de todas os ambientes de teste.

Já no ambiente de integração contínua, onde utilizamos apache com passenger, foi mais simples ainda, bastando definir para diferentes VirtualHosts RailsEnvs diferentes.

[Tiago Motta] Resolvendo o "missing uri map" no mod_jk

Thursday, July 9th, 2009

Esses dias instalei o Ubuntu 9 em meu desktop e desde então tenho preparado o ambiente de desenvolvimento de diversas aplicações legadas. Uma delas necessita do apache conectando no tomcat pelo mod_jk. Após fazer a instalação de ambos e ter configurado os pontos de montagem do módulo, tudo de acordo com minha instalação antiga, deparei-me no log com o seguinte erro:

jk_translate::mod_jk.c (3038): missing uri map for tiago.motta:/MeuPathAqui

Descobri em uma grande thread de IRC que o problema ocorre quando o apache possui algum VirtualHost configurado, e que para resolver isso basta habilitar a configuração “JkMountCopy On” no VirtualHost correspondente.

[Cristiano Casado] Globo.com no FISL 10

Tuesday, July 7th, 2009

A Globo.com esteve presente como um dos patrocinadores da edição especial do FISL (Fórum Internacional de Software Livre) em Porto Alegre entre os dias 24 e 27 de Junho de 2009.

Com um dos estandes mais movimentados do evento, onde o público pode assistir mini-palestras sobre cases de projetos, receber brindes e ter contato direto com os profissionais para troca de informações, a Globo.com consolidou sua participação no evento anual com a maturidade em mostrar os avanços conseguidos ao utilizar ativamente software livre no seu negócio e também em ouvir e aprender com a experiência de outros usuários de software livre.

Globo.com Fisl 10

Globo.com Fisl 10

No estande apresentei detalhes do projeto que visa reestruturar a forma de realizar monitoração de nossa rede e infra-estrutura utilizando o Nagios como ferramenta.  Em um bate papo de aproximadamente 1 hora mostrei quais os objetivos a serem alcançados, a estrutura do sistema, integração com o sistema de correlação de eventos (monitoração inteligente), representação gráfica dos elementos da rede, administração via web, a arquitetura proposta e também das barreiras encontradas ao longo do projeto.

Abaixo os slides de algumas das várias palestras apresentadas pela Globo.com no FISL 10.

Monitoração com Nagios
View more presentations from ccasado.
Monitoracao Inteligente na Globo.com

View more documents from denao.
Globo.com & Varnish

View more presentations from lokama.
Fisl10 MySql na Globo.com por Camila Dias

View more presentations from camilapdias.

[Tiago Peczenyj] Não entendo o motivo pelo qual ainda ensinam pascal

Monday, July 6th, 2009

Encontrei este exercicio em um forum de programação e informatica. Um tanto engenhoso, devo admitir, e é otimo para praticar diferentes linguagens de programação, que podem exercitar muitos paradigmas. Infelizmente o professor pediu para fazer em Pascal.

o número 3025 possui a seguinte caracteristica: 30+25=55 e 55*55=3025. Escreva um programa que escreva todas os números com quatro algarismos que possuem a citada características.

Veja que solução elegante temos com ruby:

>> (1000..9999).find_all{|x| (x/100+x%100)**2 == x}
=> [2025, 3025, 9801]

Entretanto tive a apelar para uma sujeira (alguem percebe?) na versão em haskell:

Prelude> import List
Prelude List> findIndices(\x -> ((x `div` 100)+(x `mod` 100))^2 == x && x > 1000)[0..9999]
[2025,3025,9801]

Por fim, um simples ‘one liner’ usando gawk

$ seq 1000 9900 | gawk '(int($1/100) + $1%100) == sqrt($1){print}'
2025
3025
9801

É claro que a solução esperada é algo como

#include <math.h>
#include  <stdio.h>
int main(){
	int i;
 
	for(i=1000;i<=9999;i++){
		if(((i/100)+(i%200))==sqrt(i))
			printf("%d\n",i);
	}
 
	return 0;
}

Até ANSI C é mais elegante – sem flamewars por favor, afinal todos sabem o que são programadores de verdade :)

[Rodolfo Carvalho] O que nós estamos fazendo aqui no Rio?

Sunday, July 5th, 2009

Após ver o post do Tapajós, deu vontade de espalhar mais pela rede o que temos feito por aqui na Cidade Maravilhosa…

Ultimamente a turma do Rio de Janeiro anda bastante agitada e muita gente está sem entender o que é Hora Extra, Coding Dojo Rio, Hack Framps e outros encontros. A explicação é simples, basicamente nós criamos uma certa rotina, com pequenos encontros onde a gente se diverte, bebe cerveja e ainda aprende muito.

Que eventos são esses?

Hora Extra

Trata-se do nosso choppinho semanal que acontece todas as segundas-feiras no Bar Antigamente a partir das 19:30h. Apesar do objetivo ser apenas jogar conversa fora e beber, é impossível juntar mais de três nerds e não rolar muita discussão sobre trabalho, tecnologias, frameworks e todas essas coisas.

Veja algumas fotos:

(Hora Extra)

O objetivo era chegar com a mesa até os táxis, mas dessa vez não deu.

(Hora Extra)

Casa cheia!

(Hora Extra)

Edição especial do Hora Extra na Intelitiva.

Coding Dojo Rio

O Coding Dojo Rio acontece todas as quartas-feiras no CEFET-Rio, a partir de 18:30. Começou do final de 2008 e já conta com a bagagem de 22 encontros realizados, média de 10 participantes e mais de 60 inscritos na lista de discussão.

(Coding Dojo Rio)

Hack Framps

A Hack Framps é o mais restrito desses eventos. Infelizmente não é possível divulgar publicamente onde ele ocorre e convidar a todos pois ele é realizado na casa do Vinícius. Em geral quem participa dos outros eventos é automaticamente incluído nesse também.

A Hack Framps é uma espécie de RejectConf, onde cada um faz uma breve apresentação sobre algum assunto que domina, ou não, e depois a gente troca algumas figurinhas. A idéia desse evento é difundir conhecimento aproveitando as diferentes habilidades que cada um de nós temos e a grande diversidade de áreas que a nossa profissão oferece.

Veja algumas fotos:

(Hack Framps)

(Hack Framps)

(Hack Framps)

(Hack Framps)

Festa Framps

A Festa Framps é mais um evento restrito lá na casa do Vínicius e é o momento da gente se redimir com as esposas. Trata-se de uma festinha para toda a familia e a coisa mais nerd que a gente faz é jogar Wii!

Então…

Esses eventos todos são uma forma que a gente encontrou de manter a galera unida, trocar idéias e se divertir muito.

Mas então, o que vocês estão fazendo na sua cidade? Como vocês estão aproveitando o talento de cada um?

[Tiago Peczenyj] Sempre defina a forma de abertura de arquivos

Sunday, July 5th, 2009

Linguagens script tornam tudo muito facil. Codificar uma informação para base64, por exemplo, pode ser feito assim:

   require 'base64'
   data = "Now is the time for all good coders\nto learn Ruby"
   Base64.b64encode(data)

Entretanto se vc quer processar o conteudo de um arquivo, vale um cuidado extra: definir a forma de abertura dos arquivos.

Por exemplo, eu posso fazer isso

   require 'base64'
   data = File.open('imagem.jpg').read
   Base64.b64encode(data)

Se eu estou desenvolvendo no linux, para mim o resultado é coerente. Eu ficaria feliz (sem sacanagem) se fosse o caso de desenvolver um software que rodasse exclusivamente nesse sistema operacional. As vezes não é bem assim…

Ruby é um bom exemplo de uma linguagem que permite desenvolver software multi-plataforma, entretanto é muito facil atrapalhar o interpretador (afinal, quem nunca teve problema com uma referência a um arquivo “C:\xxx”?). No exemplo real que eu passei, bastaria informar o modo ‘rb’ (r de read, b de binary) para o comando open que eu teria o mesmo comportamento em todas as plataformas.

   require 'base64'
   data = File.open('imagem.jpg','rb').read
   Base64.b64encode(data)

É claro que este tipo de comportamento pode ser verificado através de uma suite de testes em todas as plataformas-alvo, entretanto vale de alerta para estudarmos um pouco as caracteristicas das apis e bibliotecas nas diferentes plataformas (não adianta, desenvolver software signfica estudar constantemente).

Para terminar, vejamos esta thread:

Summary: open should default to binary mode on windows

Initial Comment:
On windows the open() function defaults to reading
files in text mode. To get a binary mode file I need
to append a “b” to the mode string. I think this is an
unnessary platform inconsistency. Twice now I’ve had
hard to track down bugs because I was reading a file in
text mode and should have been using binary. This is a
wart, IMO.

Ou seja, muita gente, em diferentes linguagens, vai enfrentar o mesmo problema de achar que o open, pode padrão, vai abrir o arquivo em modo binario. A origem disso é antiga e não vai desaparecer de uma hora para outra.

Por fim, vale lembrar que o conceito de ‘nova linha’ é diferente de acordo com o sistema operacional, no unix é \n enquanto no windows é \r\n. Também é antigo e remonta a epoca de impressoras matriciais, DOS e por ai vai. É o tipo da coisa que, pela lei de murphy, vai sacanear a gente quando menos esperamos.

Obrigado ao Rafael por ter visto este detalhe comigo tarde da noite.

[Rodolfo Carvalho] Exceptional Software Explained: Embrace Error

Sunday, July 5th, 2009

Depois de ouvir um keynote do Robert M. Lefkowitz (aka. r0ml) na PyCon 2007 sobre The Importance of Programming Literacy, virei fã desse cara…

PDF com os slides sobre The Importance of Programming Literacy

Sua forma de conduzir seus discursos é fantástica, fora o “meta-discurso”, já que na maior parte do tempo ele faz justamente o que está sendo pregado no discurso, seguindo as diversas etapas da retórica.

Hoje encontrei um vídeo da OSCON 2008 no qual ele fala sobre sua metodologia de desenvolvimento, baseada nas comunidades de software open source.

Lefkowitz compara MSF, XP, e sua metologia de software Excepcional de forma muito bem humorada e com profundos desdobramentos: