terça-feira, maio 15, 2007

Eu sou o maior do mundo!


Ontem, no final do dia, eu subi meu conceito sobre o que é "realização profissional".

Quando eu cheguei na Blinck, 5 mêses atrás, tive a infelicidade de ter atribuída a mim a responsabilidade sobre um pedaço nojento de código, que as pessoas daqui não ousavam tocar, alegando que ele tinha sido escrito pelo "vice-presidente" da empresa.

Eu comecei devagar, cautelosamente, fazendo pequenas modficações, buscando a aprovação do sujeito para cada pequeno passo que eu dava, até que ele me deu carta branca, um mês atrás, e eu comecei a reescrever pedaços grandes de código.

Semana passada, depois de ter mais problemas do que eu gostaria com uma biblioteca estranha, que estava mal-desenhada até mesmo para finalidades didáticas, eu resolvi que era hora de agir.

Ontem de noite, me sentindo o cara mais poderoso do universo, eu entreguei uma nova biblioteca para a mesma funcionalidade, totalmente resesenhada, com arquitetura baseada em drivers e em duas camadas, como deve ser.

O pessoal daqui ficou embasbacado com o resultado, e eu me sinto o cara mais poderoso do universo.

Uma das partes mais interessantes foi construir um servidor HTTP para os testes:



package MyServer;
use 5.008008;
use strict;
use warnings;
use HTTP::Daemon;
use HTTP::Status;
use Data::Dumper;
use URI;
use URI::QueryParam;
use lib 't/lib';

# reaps children automatically, no need to call wait()
local $SIG{CHLD} = 'IGNORE';

# Create new MyServer, forks off and start listening.
# Parent returns child PID, child sits on listening loop forever.
sub start {
my $class = shift;
my $pid = fork;
die unless defined $pid;
my $self = bless \$pid, $class;
unless ( $pid ) {
# child here
$self->service_loop;
exit;
}
return $self;
}

# Stops MyServer, whenever possible.
# return 1 (a true value) if process exited.
sub stop {
my $self = shift;
return kill 15, $$self;
}

# Implements the HTTP service loop.
# Upon start(), child process call this and start serving.
sub service_loop {
my $self = shift;
# Using "55${UID}" as the port number - avoid port clashes"
my $daemon = new HTTP::Daemon( LocalPort => qq{55$<} ) or die;
while ( my $conn = $daemon->accept ) {
while ( my $request = $conn->get_request ) {
my $method = $request->method;
unless ( $method eq 'GET' or $method eq 'POST' ) {
$conn->send_error( RC_METHOD_NOT_ALLOWED );
}
my @params
= delete @{ (URI->new( $request->uri ))->query_form_hash }{qw{param list here}};
my $answer = process_params( @params );
my $response = new HTTP::Response( HTTP::Status::RC_OK );
$response->content( $answer );
$conn->send_response( $response );
}
$conn->close;
undef $conn;
}
}
1;



Claro, o código foi ligeiramente modificado para permitir que eu o publicasse aqui sem ter de desrespeitar meu contrato e restrições se sigilo, como deve ser ;-) Espero que vocês compreendam.

Mais tarde, para iniciar o servidor, a gente faz assim:



use MyServer;
$server = MyServer->start;
END{ $server->stop; }

# Faça requisições ao servidor aqui



Eu nunca me diverti tanto programando como ontem. :-) Foi difícil ir para casa.

Nenhum comentário: