20100531

Pequena sutileza em busca binária

Em The Practice of Programming à p. 31, algo me parece digno de nota.
Na implementação de lookup,
1. mid = (low + high) / 2
mas pensei que o correto seria
2. mid = (high - low) / 2

A sutileza está no fato de que em 2 calcula-se o deslocamento relativo à uma porção do array do elemento do meio mid, enquanto em 1 calcula-se a sua posição absoluta.

Se temos um array de 10 elementos com posições[0..9] e estamos a procurar na porção [5..9] o deslocamento de mid relativo à porção em questão é
mid = (9-5) / 2 = 2.
Relativamente ao array todo, mid tem índice
mid = (9+5) / 2 = 7.
Claramente, 7 é o elemento 2 da porção [5..9].

A forma correta para 2 seria então
mid = mid + (high - low)/2
De modo que a sugerida no livro é mais sucinta.

20100527

17:50 conheçe um bom programador? preciso fazer um programa para um cemitério

Problemas no GROMACS

Tentar ler um trr gerado por um gromacs double num gromacs simples é problema. Problemas com free() e afins, não fui mais fundo.

GROMACS no Ubuntu 8.10

Faça o bootstrap.
./bootstrap
Configure com a precisão desejada (double irá gerar binários com sufixo _d) e habilite a "bendita" geração de bibliotecas dinâmicas.
./configure --enable-double --enable-shared
Caso esqueça de compilar com --enable-shared, limpe o build. Do contrário a compilação falha com algum erro que esqueci de olhar.

Quebra de linha em css

Li http://www.w3.org/TR/css3-text/#white-space e consegui fazer com que meus códigos inseridos aqui entre <pre> continuassem com a formatação original mas que as linhas compridas fossem quebradas.
O segredo é
white-space: pre-wrap;

20100525

Lendo um arquivo trr do GROMACS

O código abaixo lê um arquivo trr do GROMACS e imprime uma linha com o passo e o tempo correntes e n linhas com velocidades (onde n é o número de átomos).

#include <stdio.h>
#include <trnio.h>

int
main(int argc, char *argv[])
{
        int f, ok, i;
        t_trnheader h;
        rvec *v;

        if(argc < 2){
                fprintf(stderr, "usage: rtrn trajfile\n");
                exit(1);
        }

        f = open_trn(argv[1], "r");
        if(f < 0){
                fprintf(stderr, "open_trn failed to open %s\n", argv[1]);
                exit(1);
        }

        for(;;){
                /* if we find an incomplete header, abort */
                fread_trnheader(f, &h, &ok);
                if(!ok){
                        fprintf(stderr, "incomplete header\n");
                        exit(1);
                }

                v = malloc(h.natoms*sizeof(rvec));
                if(!v){
                        fprintf(stderr, "out of memory\n");
                        exit(1);
                }

                /* if we cannot read the velocities, abort */
                if(!fread_htrn(f, &h, NULL, NULL, v, NULL)){
                        free(v);
                        break;
                }

                printf("step %d time %g\n", h.step, h.t);
                for(i=0; i < h.natoms; i++)
                        printf("%g %g %g\n", v[i][0], v[i][1], v[i][2]);
                free(v);
        }
        return 0;
}
Assumindo GROMACS instalado, compile com algo como:
cc -I/usr/local/gromacs/include/gromacs -Wall -lm -L/usr/lib64 -L/usr/local/gromacs/lib -o x x.c -lgmx -lm -lX11 -lXt -lpthread

20100521

Compilando inferno sem suporte gráfico

Em $ROOT/emu/$SYSHOST/mkfile, mude CONF=emu para CONF=emu-g e compile normalmente.

20100519

OpenBSD 4.6 no qemu 0.11.0 sobre Ubuntu 9.10

No host rodo qemu com um script:
host% cat bin/qbsd
#!/bin/sh
sudo qemu -localtime -hda ~/Downloads/emul/obsd.hd -net nic,model=e1000 -net tap,ifname=tap1 $*

A rede é configurada de modo que a tapN do host tem ip 10.0.N.1 e o guest ip 10.0.N.2:
host% cat /etc/qemu-ifup
#!/bin/sh

iface=`echo $1 | sed 's/.*\([0-9]\+\)/\1/'`
echo $iface
sudo ifconfig $1 10.0.`expr $iface + 1`.1 netmask 255.255.255.0


Usando a emulação padrão (Realtek) o qemu cospe vários 'watchdog timeout' e sua rede com o host fica inutilizável.
Emulando e1000, com ou sem kvm, tudo funciona.

O problema foi resolvido usando-se o comentário de Tim em http://scie.nti.st/2009/10/4/running-openbsd-4-5-in-kvm-on-ubuntu-linux-9-04.