EPx professional blog and repository for braindumps

2009/04/24

More digital archeology

Atendi um dos leitores deste blog, providenciando um ISO do Conectiva 4.2 Edição Servidor para ele. E isto acabou virando uma nova rodada de "arqueologia".

Como eu uso Mac OS X atualmente, estava em dúvida se a imagem ISO obtida usando-se "dd" estava íntegra, então resolvi instalar novamente o Linux na VM para ver se estava OK. Mandei instalar "todos os pacotes" e em um piscar de olhos estava pronto.

Mas como certos hábitos são difíceis de matar, eu *tinha* de tentar fazer o modo gráfico funcionar direito nesse velho Linux... E consegui, conforme o primeiro screenshot mostra. 800x600, 16 bits de cor. Era o que o meu saudoso notebook Fujitsu E330 dava conta.

Vendo os servidores X instalados, notei que tinha um XF86_FBDev no meio. Então lembrei do framebuffer do kernel, que podia ser usado no X na falta de driver mais adequado. A configuração no /etc/lilo.conf eu ainda sabia de cor (é incrível como o cérebro retém esses lixos...) mas a configuração no XF86Config eu precisei colar daqui. As partes relevantes de ambas as configurações podem ser vista no segundo screenshot.

A reader of this blog asked me an ISO image of Conecitva Linux 4.2. And that became a new round of digital archeology.

Since I use Mac OS X, I didn't trust the ISO image I made using "dd", so I did a brute-force test by installing that distro, all packages. It was fast as an eye blink.

Old habits are hard to kill. I was sucked into the challenge of making graphics mode work decently for that old Linux. And I did it, as the first screenshot shows. The trick was to use the Linux framebuffer, and XF86_FBDev server. I still knew the /etc/lilo.conf framebuffer configuration by heart (it is incredible how the brain retains so much garbage), but I had to relearn XF86Config from here. The latter screenshot shows the relevant configuration lines of both files.

2009/04/22

Digital archeology


Por esses dias, faz 11 anos que eu mexo com Linux. No dia 16/4/1998, recebi pelo correio o "Linux: The Complete Reference", da Walnut Creek CDROM. No dia 30/4, recebi os CDs do Slackware 3.4, e aí a brincadeira começou pra valer.

Para comemorar, decidi fazer hoje um negócio que estava para fazer há tempos: tentar instalar um Linux bem velho. Na ausência de um PC disponível para isto, usei uma máquina virtual mesmo. Instalar Slackware 3.4 seria um pouco aborrecido demais, então decidi testar os Conectiva 3.0 e 4.2, de 1999. 10 anos de idade já é velho o suficiente.

Eu apostava que não ia funcionar absolutamente nada, e não ia passar nem da instalação. Mas que nada: instalou e funcionou a rede. A coisa só empacou onde já empacava na época: na configuração do modo gráfico. Não houve jeito de fazer o Conectiva 3.0 entrar em modo gráfico. O 4.2 conseguiu entrar em VGA 16 cores.

Aí está o Konqueror, aberto na Folha de São Paulo em 16 cores, 640x480. Apesar dos pesares, é possível ler o conteúdo, provavelmente graças ao CSS. O Netscape, abrindo o mesmo site, só mostrou uma página em branco. O KHTML já mostrava ter um futuro promissor (WebKit).

It's been eleven years since I began to use Linux. By 1998/4/16 I received my copy of "Linux: The Complete Reference" from Walnut Creek CDROM. Slackware 3.4 CDs arrived some days later, and then the fun began for real.

In order to celebrate, today I tried something I was thinking about for a long time: (try to) install a very old Linux distribution. In the absense of an available PC, a VMWare virtual machine was used instead. Slackware would be a bit too boring, so I chose Conectiva Red Hat Linux 3.0 and 4.2. Both are from 1999, old enough to be fun to play with.

I'd bet that they would not even install, let alone work, but both installed and worked, and could reach the Internet. The only big problem was already a big problem back at 1999: video card configuration. I managed to make 4.2 work with VGA 16 colors, and that was everything I could squeeze out of XF86Config.

At the second picture, you can see Konqueror opening a site with the full glory of dithered color and 640x480 real estate. Netscape showed nothing at all for the same site. KHTML was already set to be a success back then, as the WebKit engine.

2009/04/21

Nos bons tempos em que eu defendia C++

Parte de minha macro "epx.h", com um for-each caseiro para evitar o algoritmo foreach() overengineered da STL++:

#define self (*this)

#define ForEach(cont, it) \
for(__typeof__((cont).begin()) it = (cont).begin(); it != (cont).end(); ++it)


E é claro, todo programador C++ que se preze faz seu próprio smart pointer caseiro:

#undef __DANGEROUS__

template class PtrRef;

template class Ptr
{
public:
inline Ptr()
{
payload = new PtrRef(0);
}

inline Ptr(TIPO* parg)
{
payload = new PtrRef(parg);
}

inline Ptr(const Ptr& arg)
{
payload = arg.payload;
++payload->referencias;
}

inline Ptr& operator=(const Ptr& outro)
{
++outro.payload->referencias;
if(--payload->referencias == 0) {
delete payload;
}
payload = outro.payload;
return *this;
}

inline ~Ptr()
{
if (--payload->referencias == 0) {
delete payload;
payload = 0;
}
}

inline TIPO* operator->() const
{
return payload->ponteiro;
}

inline TIPO& operator*() const
{
return *(payload->ponteiro);
}

inline bool operator!() const
{
return (payload->ponteiro == 0);
}

inline operator bool() const
{
return (payload->ponteiro != 0);
}

inline TIPO* pointer() const
{
return payload->ponteiro;
}

#ifdef __DANGEROUS__
inline operator TIPO*() const
{
return pointer();
}
#endif

private:
PtrRef* payload;
};

template class PtrRef
{
inline PtrRef(TIPO* p)
{
ponteiro = p;
referencias = 1;
}

inline ~PtrRef()
{
delete ponteiro;
ponteiro = 0;
}

TIPO* ponteiro;
unsigned int referencias;

friend class Ptr;
};

Depois o sujeito tem de tomar remédio de doido já aos 30 anos e não sabe por quê...

2009/04/20

Valorização e valoração

"Que o colono se orgulhe da enxada
e o campeiro se orgulho do laço
Cada um valorize o que é seu
É assim que se busca espaço"

-- Música gauchesca (Os 3 Xirus)

Lembro de uma conversa, há muito tempo atrás, numa mesinha do Delta, lá no Shopping Recife, em que discutíamos o livro "Hackers and Painters" do Paul Graham.

Como o Osvaldo (dono da cópia do livro que a galera tinha dado uma olhada) não estava presente, o consenso da mesa era que o Paul Graham supervalorizava a si mesmo e aos desenvolvedores. Em particular um dos presentes, com pretensões de chefia e gerência na carreira, deixou bem claro que, para ele, programador era equivalente a peão de fábrica. Fazendo justiça a ele, friso novamente que ninguém tratou de discordar.

Todo mundo sabe que desenvolvedor é um animal esquisito, e muitos de nós tiram proveito das especificidades do trabalho para dar vazão aos defeitos de personalidade (como falta de senso de prioridade e excesso de senso crítico) ao invés de tratá-los ou mantê-los sob controle.

Mas, qual é a profissão em que isto não acontece? De que vale esse "realismo científico" ao falar-se da própria profissão?

Hoje, zapeando os canais da antena parabólica, que é pródiga em canais esquisitos como Canal do Boi, Futura, TV Senado e outras aberrações, caí num programa sobre o Poder Judiciário. Uma mulher reclamava prolixamente a respeito de algo que, no meu ponto de vista, era uma bobagem infinitesimal. Definitivamente, o realismo científico tinha passado bem longe dali...

Me ocorreu então que, enquanto nós nos auto-imolamos, o resto das pessoas, de garis a políticos, está valorizando o que faz, fazendo valer (até demasiadamente) a importância do seu trabalho no mundo.

Muita gente da nossa área vê a profissão de desenvolvedor como um purgatório cujo objetivo final é chegar a um cargo de chefia. Um sujeito como eu, com 34 anos recém-completos e ainda trabalhando como reles programador "é esquisito". Mas, aproveitando a deixa judiciária, muitos advogados não querem ser juízes. Até oficiais de justiça ganham MUITO bem. Por que não se pode ser feliz e bem-sucedido como desenvolvedor?

Se você não se valoriza, ninguém vai fazê-lo por você. O mesmo vale para a profissão que você exerce.

As conseqüências práticas estão aí para todo mundo ver. O teto de salário de um desenvolvedor é muito mais baixo do que advogados, médicos ou pilotos de avião, sem nenhum motivo intrínseco para que isto aconteça. Na verdade, a desvalorização começa já dentro de casa: você participa de uma lista de discussão e a esposa já fica achando que você está paquerando on-line.

É como eu costumava dizer a um colega de trabalho: "se você está feliz, é porque não está trabalhando o suficiente". Naturalmente eu falava isso brincando, mas é a atitude de muitas chefias na nossa área. Eu sempre fui esperto o suficiente para evitar trabalhar em "fábricas de software", mas eu ouço diversas histórias desses ambientes. Naturalmente, tais chefias só se criam onde a "peãozada" tem baixa auto-estima. Se ele tentasse aplicar a mesma tática algures, seriam linchados.

Em resumo, convoco os colegas de profissão a refletir a respeito disso, para que tenhamos nosso lugar ao sol.

2009/04/14

N810 makes a good car GPS

I put my hands again in a N810 again. This time I decided to give it a try as an onboard device, and installed the base on my car. The drill holes went in the plastic cap that is discarded when you install a CD-player (yes, I *still* did not install a CD player in car!), so no regrettable scars lefts when I'll eventually return the tablet.

I didn't put much faith in preinstalled Map and in N810 GPS capabilities, but I must admit I was wrong. It takes some time to first lock the GPS position (some minutes), but after it locks, it is very precise, and the Brazil map contains the street maps for Joinville. The errors don't go beyond putting the crosshair in the wrong side of the street (which is most probably map offsets than GPS errors). And it works very well without an external GPS antenna. It even keeps locked indoors, in single-store houses.

Outside Joinville, or being more specific, the very moment you put your feet outside Joinville perimeter, the crosshair gets more and more distant from the hightway -- 2 to 3 km errors. I was still wondering if it could be the GPS, but when I crossed a railway, the crosshair was dead right on spot. The problem was the map. In fact, the highways in my area were plotted the same way as they were in Flight Simulator 2000, so I think both drank from the same fountain. (Google Maps does it right, so there are more recent and more precise Brazil maps).

I went to the seashore to tally the GPS alleged altitude with sea water level. Altitude has a constant +3m offset (showed 3,10m at seawater level), no big deal and seemed to be a constant offset everywhere, so it is easy to compensate for. (I did not find a way to "calibrate" it, though).

A new software has been added to Maemo repository: an experimental A-GPS support. It allows to detect your approximate position by using an Internet connection, just as cell phones do automatically with packet data. Even a gross estimative of current position helps GPS a lot, allowing it to lock in a matter of seconds instead of minutes. But Maemo version goes beyond: it also allows *you* to point your approximate location in a world map, so you don't even need an Internet connection to enjoy A-GPS benefits! This is important in remote areas with no cell phone coverage and mountains that hide parts of the sky.

In short, N810 makes a good GPS and since the price is not that distant from a standalone GPS unit with equivalent screen size, it may be a better option. Hope the GPS keeps this performance in Maemo 5 device, which is the one I'll buy!