Posts de July, 2009

[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:

[Rodolfo Carvalho] Coding Dojo Rio

Saturday, July 4th, 2009

Não tenho escrito muito nas últimas semanas, mas algo que gostaria de destacar agora é o nosso Coding Dojo Rio.

Não só chegamos a marca de 20 sessões realizadas, como também na última quarta-feira tivemos o prazer de reunir 14 pessoas no dojo.

Já foram 22 encontros, temos 65 pessoas no grupo de emails, e temos um grupo bastante estável e coeso. Tem sido uma experiência maravilhosa compartilhar código e ideias com essa galera…

Você que está lendo aqui deveria procurar mais as práticas Ágeis, experimentá-las, não ter medo de mudar!
Não deixe essa falsa impressão de “não mudo time que está ganhando”, por que isso esconde as melhorias que seriam conquistadas quando damos um passo de coragem.

Mude, dê espaço para você mesmo se tornar uma pessoa melhor!

Hmm, depois do devaneio, links para os últimos posts do Dojo Rio, com muitas fotos do grupo:

[Rafael Biriba] PHP: Arquivo de log personalizado

Thursday, July 2nd, 2009

 

PHP: http://www.php.net/

PHP: http://www.php.net/

Semana passada, estive fazendo num pequeno site, uma área de login. Foi então que fiz uma funçãozinha no PHP que gera logs diários dos eventos ocorridos desde o login até o logoff, como por exemplo, ações tomadas pelos usuários na parte administrativa.

Abaixo, vocês poderão conferir o código que utilizei, logicamente adaptado para que fosse publicado aqui.

Os arquivos de log são gerados baseado no dia em que se encontra. Como os arquivos estão em formato .txt, utilizei um prefixo no arquivo, para que o acesso não seja tão óbvio por pessoas desautorizadas.

A função armazena no arquivo a hora da ocorrência, seguido pelo IP da máquina do cliente e a mensagem definida por você.

Vamos então seguir para o código:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?php
 
date_default_timezone_set('America/Sao_Paulo');
 
function Logger($msg){
 
$data = date("d-m-y");
$hora = date("H:i:s");
$ip = $_SERVER['REMOTE_ADDR'];
 
//Nome do arquivo:
$arquivo = "Logger_$data.txt";
 
//Texto a ser impresso no log:
$texto = "[$hora][$ip]> $msg \n";
 
$manipular = fopen("$arquivo", "a+b");
fwrite($manipular, $texto);
fclose($manipular);
 
}
 
?>

Salve o arquivo acima como logger.php

Na linha 3 estou declarando o timezone para São Paulo, mesmo estando no Rio de Janeiro, o horário é o mesmo. Isso serve para configurar a data para minha localidade, já que no meu caso, o servidor se encontra em outro fuso horário.

Nas linhas 7, 8 e 9 estou declarando as variáveis de data, hora e ip da máquina que gerou o log (cliente).

Na linha 12 está o nome do arquivo. Será algo do tipo Logger_19-06-2009.txt (dia-mês-ano). Caso deseje armazenar o log em uma pasta já existente, altere a linha para:
$arquivo = “minhapasta/Logger_$data.txt”;

Na linha 17 está a função de abertura do arquivo.  Passando o “a+” como parâmetro, apenas nos dias que tiver alguma coisa para ser inserida no log, é que o arquivo será criado ou se já existir, escreverá o registro no fim do arquivo. O parâmetro “b” serve para questões de portabilidade ( inserção recomendado no manual do php )

As linhas 18 e 19 manipulam e fecham o arquivo definido na linha 12.

Agora vamos para o código onde vamos utilizar nossa função:

1
2
3
4
5
6
7
8
9
<?php
 
include "logger.php";
 
Logger("Testando a função logger !");
Logger("Como você pode ver, estou logando uma informação !");
Logger("Teste 1, Teste 2, Teste 3!");
 
?>

Salve o arquivo acima como teste.php na mesma página onde se encontra o logger.php.

Pronto. O Script acima gera 3 saídas consecutivas no seu arquivo de log.
Conferindo o resultado:
Nome do arquivo gerado:
Logger_19-06-09.txt

Conteúdo:
[21:57:36][201.7.xxx.xxx]> Testando a função logger !
[21:57:36][201.7.xxx.xxx]> Como você pode ver, estou logando uma informação !
[21:57:36][201.7.xxx.xxx]> Teste 1, Teste 2, Teste 3!

Bom, espero que o script sirva para mais alguém. :)

[Rodolfo Carvalho] Morte ao email do BOL e UOL

Wednesday, July 1st, 2009

Depois de o blog da PythOnRio ter sido bombardeado pelo filtro anti-spam do BOL e UOL, eis que surge a campanha “Morte ao email do BOL e UOL“:

Qual o melhor jeito de se evitar spam via email? Um filtro bayesiano? Educação do usuário?

Não! Simplesmente DESATIVE O EMAIL DO USUÁRIO! É isso mesmo! Quando você recebe uma mensagem, o BOL e o UOL simplesmente não levam a mensagem até o destinatário. O servidor responde o remetente dizendo: “Você mandou uma mensagem para Fulano, se você não for um spammer clique aqui e prove sua boa intenção digitando o captcha.”

Isso significa que se o remetente não tomar as medidas impostas pelo BOL e o UOL, o destinatário simplesmente não receberá o email.

Agora imagine se o usuário do BOL e o UOL preenche algum formulário em um site e este site envia um email automático como feedback desta ação? Resultado: 1600 mensagens pedindo confirmação de que o site não é um spammer.

Este é um caso clássico de quando TI significa Totalmente Imbecil! E que fique claro que não digo isso para as pessoas técnicas destas empresas. Pois tenho certeza que este workflow absurdo foi imposto por algum “Gerente” ou “Diretor” que não faz idéia das consequências dessa decisão.

Seria ótimo se o pessoal das campanhas “Morte ao IE 6″ iniciassem uma nova: “Morte ao email do BOL e UOL”, afinal, o GMail ganha de goleada.