Monthly Archives: April 2007

Vida pós-FISL

Primeiro, claro, alguns comentários sobre o FISL 8: como sempre, foi muito bom rever os meus vários amigos, bater papo, trocar idéias sobre assuntos técnicos ou não. Tive oportunidade de discutir com diversas pessoas o design do PyMeter, que aliás anda meio parado por minha falta de tempo, e do gksu. A primeira apresentação que assisti (só o final) foi a do Mazoni falando de qualidade de vida, crença nas pessoas e da qualidade do ambiente de trabalho. Bastante emocionante, para dizer a verdade, gostei muito. É uma pena que a Celepar ainda não tenha respondido definitivamente questionamentos sobre o fato de a LPG-AP não ser software livre (e ter sido avaliada como tal inclusive pela FSF), mas pelo que vinha sendo feito no final de 2006, creio que isso seja resolvido logo, vamos ficar de olho.

Tem mais coisas pra falar, provavelmente, mas eu lembro depois =D.

Tenho feito, agora que o Etch foi lançado, uma geral nos meus pacotes. Mandando versões novas para unstable, experimentando novas técnicas para alguns pacotes serem mais úteis ou mais simples. Semana passada consegui tratar do Glade3, principalmente, entre outros. Essa semana foi pythonica: ConfigObj e CherryPy3 receberam bastante amor. Próximo passo é olhar bastante para gksu e sua turma, que vai levar bastante trabalho de código propriamente dito.

No trabalho, por motivos que não cabe expor aqui, tenho ajudado um time de desenvolvedores (eu sou da produção) a resolver um problema de leak de memória no código Java deles. Hein? Isso mesmo. Java também tem vazamento de memória, mas de uma forma diferente: Java (e outras linguagens, Python incluso) depende do Garbage Collector para liberar memória. O GC somente libera objetos que não tenham mais nenhuma referência (ponteiro, para amigos do C); se você não vai usar mais um objeto, mas não retira dele todas as referências, ele começa a lotar sua área “Tenured” (a JVM divide o Heap em várias áreas para otimizar o GC) com objetos inúteis, até que a memória destinada à JVM acaba. Para quem interessar, as duas melhores ferramentas que eu achei para fazer análise disso, até agora, foram HPROF, que vem com o JDK, e HAT (http://hat.dev.java.net/) para analisar o dump de heap que o HPROF gera.

Tudo em Java é tão mais difícil… deu até saudade de memprof e valgrind (que eu até então achava chato). Tudo é tão mais lento, complexo… enfim, admiro pacaramba a Sun por ter feito algo tão ruim, improdutivo e lento e ainda assim conseguir vender pra tanta gente a idéia. Admiro a Sun por ter liberado (ou prometido liberar) o Java como software livre, também. Em favor da Sun eu tenho a dizer que das empresas que lidam com SL ela talvez seja a que mais faz, embora muitas falem tanto quanto ela. OpenOffice.org, GNOME, e agora Java, todos se beneficiam bastante do trabalho da Sun, e por isso eu realmente a respeito, mas não pela qualidade do Java =P.

Resultado: um colega de trabalho, Jose Assis, citou que tinha feito não sei o que em Assembly e minha veia nerd coçou fortemente, incentivada pelas horas de insanidade que passei com Java, e tive de ir brincar com ASM também. Acabei gastando boas horas das minhas aulas de Java na faculdade fazendo um programa que baixa a página de teste do apache do Debian do localhost, sem usar funções da libc, usando somente chamadas de sistema:


.data
msg:
.ascii "GET /apache2-default/ HTTP/1.0\n\n"
len = . - msg

.bss
servaddr:
.space 128, 0
servaddrlen = . - servaddr

sock:
.long 0x0

buffer:
.space 256
bufferlen = . - buffer

bytesread:
.long 0x0

.text
.global main

main:
pushl %ebp
movl %esp,%ebp
subl $12,%esp

movl $102,%eax /* socket () */
movl $1,%ebx
pushl $6
pushl $1
pushl $2
movl %esp,%ecx
int $0x80
/* is this needed?
movl %ebp,%esp
popl %ebp
doesn't look like*/

movl %eax,sock /* save the return value of the socket() call */

pushl %ebp
movl %esp,%ebp
subl $136,%esp

movl $102,%eax
movl $0x03,%ebx
movw $0x02,servaddr /* build the sockaddr struct */
movw $((80 & 0xff00) >> 8 | (80 & 0xff) << 8),servaddr+2
movl $0x0100007f,servaddr+4
pushl $servaddrlen
pushl $servaddr
pushl sock
movl %esp,%ecx
int $0x80

movl $4,%eax
movl sock,%ebx
movl $msg,%ecx
movl $len,%edx
int $0x80

L1:
movl $3,%eax
movl sock,%ebx
movl $buffer,%ecx
movl $256,%edx
int $0x80

movl %eax,bytesread
cmpl $0,%eax
je L2

movl $4,%eax
movl $1,%ebx
movl $buffer,%ecx
movl bytesread,%edx
int $0x80
jmp L1

L2:
movl $1,%eax
movl $0,%ebx
int $0x80

ret

Deve estar cheio de erros, dado meu grande desconhecimento de ASM, syscalls e de como funciona de fato o CPU, pilha, etc, mas funciona bonitinho:


kov@cenoura:~/src/asm$ strace -s 1024 ./socket
[...]
socket(PF_INET, SOCK_STREAM, IPPROTO_TCP) = 3
connect(3, {sa_family=AF_INET, sin_port=htons(80), sin_addr=inet_addr("127.0.0.1")}, 128) = 0
write(3, "GET /apache2-default/ HTTP/1.0\n\n", 32) = 32
read(3, "HTTP/1.1 200 OK\r\nDate: Sat, 21 Apr 2007 19:05:00 GMT\r\nServer: Apache/2.2.3 (Debian)\r\nLast-Modified: Sat, 20 Nov 2004 20:16:24 GMT\r\nETag: \"6400b-2c-4c23b600\"\r\nAccept-Ranges: bytes\r\nContent-Length: 44\r\nConnection: close\r\nContent-Type: text/html; charset=UTF-", 256) = 256
write(1, "HTTP/1.1 200 OK\r\nDate: Sat, 21 Apr 2007 19:05:00 GMT\r\nServer: Apache/2.2.3 (Debian)\r\nLast-Modified: Sat, 20 Nov 2004 20:16:24 GMT\r\nETag: \"6400b-2c-4c23b600\"\r\nAccept-Ranges: bytes\r\nContent-Length: 44\r\nConnection: close\r\nContent-Type: text/html; charset=UTF-", 256HTTP/1.1 200 OK
Date: Sat, 21 Apr 2007 19:05:00 GMT
Server: Apache/2.2.3 (Debian)
Last-Modified: Sat, 20 Nov 2004 20:16:24 GMT
ETag: "6400b-2c-4c23b600"
Accept-Ranges: bytes
Content-Length: 44
Connection: close
Content-Type: text/html; charset=UTF-) = 256
read(3, "8\r\n\r\n<html><body><h1>It works!</h1></body></html>", 256) = 49
write(1, "8\r\n\r\n<html><body><h1>It works!</h1></body></html>", 498

<html><body><h1>It works!</h1></body></html>) = 49
read(3, "", 256) = 0
_exit(0) = ?
Process 14468 detached

Eu vou ao FISL… Debian e devaneios sobre educação

Eu não ia. Tinha resolvido que era melhor focar somente no evento de Maio, no Amazonas, em que vou falar de Debian e TurboGears e na Debconf, para a qual já comprei passagem e estou pleiteando financiamento, inclusive.

Mas aí fiquei sabendo pelo meu chefe que o MDS, onde eu trabalho hoje em dia, vai patrocinar o evento e que terá direito a uma palestra, e fui escalado junto com a Fabiana, desenvolvedora PHP que cordena a equipe de desenvolvimento do Ministério.

A apresentação é sobre um assunto interessante e tem bastante resposta pra ‘show us the code’, embora, como todas as iniciativas de governo que existem, seja bastante ‘marginal’, não indo tão a fundo no conceito do software livre, sendo mais usuário que produtor.

Então poderemos nos ver por POA no FISL! No campo Debian, estou ansioso pela saída da Etch, e pela Debconf. Minha vida debiânica tem sido basicamente manter os pacotes do gksu e TG redondinhos e com traduções atualizadas para a Etch, mas minha cabeça já está borbulhando com idéias para a próxima era do gksu; vou detalhá-las mais aqui em outra ocasião.

Outra coisa que tem estado bastante na minha cabeça é Educação; não é novidade pra quem me conhece que eu sempre pensei muito sobre como aprender e como a educação deveria ser. Postei várias vezes nos meus antigos blogs sobre isso. Por diversas razões tenho pensado muito nisso nos últimos tempos. A idéia principal que gira na minha cabeça ultimamente é que talvez fosse muito melhor se a educação fosse focada em habilidades, ao invés de ser focada em conhecimento.

Por que não ensinar as pessoas a entender e resolver problemas, ao invés de fazê-las decorar métodos de resolução de equações de segundo grau, por exemplo? Não seria mais útil ensinar interpretação de textos de verdade ao invés de obrigar pessoas a decorarem regras de gramática? Estive pensando bem e acho que a única habilidade que nós realmente praticamos durante nossa vida escolar é a de memorizar; bastante alinhada com a realidade que conhecemos na vida profissional, se você pensar bem… de que tipo de habilidade você precisa para fazer certificações e concursos, afinal? =)