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

One thought on “Vida pós-FISL”

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>