Legacy tiagomadeira.net

Archive for January, 2007

Airforce One 14E4:4318

Friday, January 26th, 2007

Nunca mexi com wireless. Nunca mexi com ndiswrapper. O mais legal é que eu nem mesmo tenho nem uma antena de wireless aqui perto pra “testar” alguma coisa.

Para configurar o adaptador wireless do Acer Aspire 5050-3205, que o lspci reconhece como:

Network controller: Broadcom Corporation BCM4318 [AirForce One 54g] 802.11g Wireless LAN Controller (rev 02)

… eu tentei fazer o que Morimoto ensina nesse artigo, só que com Gentoo, 64bits e nada de gráficos do Kurumin tive que adivinhar algumas coisas. Não sei se funcionou o reconhecimento do driver, porque não sei configurar wireless.

O que eu fiz foi:

# emerge ndiswrapper

(pra instalar esse negócio que vai “emular” um driver de windows)

# wget ftp://ftp.support.acer-euro.com/notebook/ferrari_4000/driver/winxp64bit/80211g.zip

(o driver da minha placa, com PCI ID igual e tudo, peguei aqui)

# unzip 80211g.zip
# cd pasta-que-ele-criou
# ls
BCMWL564.SYS  Setup.exe  bcm43xx.cat  bcmwl5.inf
# ndiswrapper -i bcmwl5.inf
installing bcmwl5 ...
forcing parameter IBSSGMode from 0 to 2
# ndiswrapper -a 14E4:4318 bcmwl5
couldn't create symlink for "14E4:4318.5.conf": File exists -
installation may be incomplete
driver 'bcmwl5' is not installed (properly)!
# ndiswrapper -l
bcmwl5 : driver installed
        device (14E4:4318) present

Semana que vem, depois de aprender a configurar, vou testar na casa da Carol, que usa wireless. ;)

[tags]acer, aspire, wireless, network, linux, gentoo, ndiswrapper, driver, kernel[/tags]

Acer Orbicam

Friday, January 26th, 2007

Agora que já estou com o Acer Aspire 5050-3205 quase totalmente configurado com Gentoo, estou resolvendo os últimos problemas de hardware, que creio que são os mais difíceis: wireless e webcam.

Estou conseguindo gravar DVDs, usar ponto de interrogação (eba!) = AltGr+W, o som hda-intel já está funcionando (embora eu não consiga salvar as configurações entre as sessões – alsactl store/restore), estou a 1280×800 usando drivers proprietários da ATI e chegando a 1600fps com a ATI Radeon Xpress 1100. O sistema está quase redondo e bem rápido.

Acabei de entrar em contato com o Michel Xhaard, doutor francês responsável pelo GSPCA, que é o driver que suporta as câmeras no Linux. A câmera do Acer Aspire 5050-3205 no lsusb -v é reconhecida como:

idVendor 0x0c45 Microdia
idProduct 0x6260
bcdDevice 1.00
iManufacturer 0
iProduct 1 USB20 Camera

Na resposta do e-mail que eu mandei pra ele (e que ele respondeu em menos de meia hora, achei super legal!), ele disse que isso é igual uma Sonix USB2.0 sn9c201+Ov7670. O GSPCA ainda não a suporta, mas segundo o Michel, ele deve suportar em breve. Então, se você tem uma câmera embutida da Acer como a minha, o lance é ficar ligado e esperar pelo “sn9c20x” na lista de drivers suportados. ;)

Compare preços de notebooks no Buscapé!

[tags]acer, aspire, webcam, camera, linux, gentoo, orbicam, gspca, driver, kernel[/tags]

Aspire 5050-3205 é pop!

Wednesday, January 24th, 2007

Palavras mais buscadas para entrar nesse site segundo o Slimstat desde 15 de dezembro de 2006:

  • tiago – 44 IPs
  • acer 5050-3205 – 36 IPs
  • acer aspire 5050 – 22 IPs
  • acer 5050 – 22 IPs
  • tiago madeira – 11 IPs
  • windows live menseger – 10 IPs
  • LAN HOUSE – 10 IPs
  • 5050-3205 – 9 IPs
  • ACER ASPIRE 5050-3205 – 8 IPs
  • acer 5050 3205 – 8 IPs
  • como entrar no youtube – 8 IPs
  • aspire 5050 – 8 IPs
  • hackear orkut – 8 IPs
  • roubar senha de msn – 6 IPs
  • roubar msn – 6 IPs
  • senhas do msn – 6 IPs
  • “hackear orkut” – 5 IPs
  • ATI Radeon Xpress 1100 – 5 IPs
  • descobrir senha do msn – 5 IPs

Aqueles posts pra conseguir paraquedistas estão rendendo e os ganhos do Adsense desse mês estão melhores que o do mês passado e muito melhores do que do mês retrasado. Mesmo assim ainda estão baixos. Nessa semana eu estou com uma média de um dólar por dia.

Além dessas palavras-chave, também buscaram hotchick, sexygirl, entre outras besteiras assim que eu escrevi no post sobre MSN.

Bom… Pelo menos eu devo estar dando um retorno real pra quem procura sobre o Acer Aspire 5050-3205 no Google. :) O hardware dele está sendo cada vez melhor reconhecido aqui… Não consegui fazer o wireless funcionar, mas agora o som hda-intel e a placa de vídeo estão perfeitas (a Radeon tá fazendo 1600 frames por segundo!) O AltGr+W = ponto de interrogação ainda não funcionou! Modifiquei na pasta symbols do XKB como vários locais na internet dizem, mas não funciona. Novidades a qualquer momento… ;-)

[tags]acer, aspire, 5050-3205, 5050, msn, estatísticas, tiago[/tags]

for (d=hoje; d<=17/03; d++) { Estude – OBI }

Wednesday, January 24th, 2007

IMPORTANTE: Esse post não é recomendado pra quem nunca programou. Escrevi sem pensar neles… :-)

Bom… Existem pessoas que sabem programar e não programam. O difícil na arte de programar é pensar, porque o resto é escrever em inglês e se acostumar com uma sintaxe rigorosa.

Comecei ontem a ensinar um amigo a programar em C para participar da OBI 2007, que foi anunciada nessa semana. Eu poderia ensinar Pascal, que é mais que suficiente para olimpíadas (quem conhece o André Linhares entende o que eu quero dizer…), mas resolvi ensinar C porque eu me embabacaria no Pascal e no C eu vejo os blocos mais “definidos” com as chaves; aqueles begins e ends “sujam” o código. E como diz o lema do sistema desse blog, code is poetry.

O reverendo e meus leitores mais novos devem estar se perguntando: como o Tiago é capaz de fazer essas loucuras? É verdade que fiquei um bom tempo sem escrever sobre programação, mas adoro isso! É lazer pra mim e essa também é a minha profissão, já que eu não consigo viver desse blog (por culpa sua que não clica nos meus anúncios…). Só quando começo a brincar é que lembro como é divertido e acho que é porque eu me sinto “no poder”. :-)

Mas voltando ao assunto… Esse meu colega é campeão regional de matemática e tem uma facilidade incrível para matérias exatas (e pras humanas mais ainda, eu acho). Eu estava sem nada pra escrever aqui no blog e resolvi escrever sobre o que eu vou ensinar pra ele amanhã: arrays e for.

Meu aluno está resolvendo a prova da Programação Nível 1 da OBI2005. Ele já resolveu a Frota de Táxi e agora precisa resolver o problema Campos de Minhoca.

O problema é que, pela primeira vez, ele se depara com uma situação em que tem que receber como entrada uma tabela completa! Sugeri que ele usasse dois while, um dentro do outro. Ele pensou um pouco e conseguiu fazer o seguinte código:

scanf("%d %d", &n, &m);

natual=1;
while (natual<=n) {
matual=1;
while (matual<=m) {
scanf("%d", &valor);
matual=matual+1;
}
natual=natual+1;
}

Perfeito. Era o que eu queria que ele fizesse. Mas agora entenda sua situação: como armazenar todos esses números pra depois trabalhar com eles?

Dessa maneira, cada vez que recebemos um novo elemento da tabela, colocamos numa variável valor e ao final do recebimento da entrada ficaremos apenas com o último elemento da tabela.

E então entram os arrays...

Arrays são matrizes de matemática ou, numa língua muito mais fácil, tabelas. Vamos supôr que eu receba 1000 valores e queira saber qual é o maior deles. Imaginem como seria para declarar suas variáveis, recebê-los e tratá-los:

int var1, var2, var3, var4, ..., var1000;

scanf("%d", &var1);
scanf("%d", &var2);
scanf("%d", &var3);
scanf("%d", &var4);
...
scanf("%d", &var1000);

if (var1>maior) {
maior=var1;
}

if (var2>maior) {
maior=var2;
}

if (var3>maior) {
maior=var3;
}

...

Impossível! Totalmente inviável. Então alguém teve a brilhante idéia de criar um elemento que guarda várias variáveis de uma vez. Então surgiram os arrays. Você cria uma só variável e na sua declaração coloca o número de elementos que ele tem dentro de chaves.

int var[1001];

Depois para receber os valores você pode então simplesmente usar o while como usou no exemplo do Campos de Minhoca:

int var[1001], indice;

indice=1;
while (indice<=1000) {
scanf("%d", &var[indice]);
indice=indice+1;
}

E para ver qual é o maior deles basta usar mais um while:

indice=1;
while (indice<=1000) {
if (var[indice]>maior) {
maior=var[indice];
}
}

Mas peraí... Então como faríamos no Campos de Minhoca? Lá não temos só uma lista de N números, mas uma tabela mesmo, com altura e largura. É simples, basta fazer com que cada índice dessa lista seja outra lista.

int tabela[1001][1001];

Assim, podemos acessar todos os elementos e pra saber o elemento da coordenada 5, 23 basta usar a variável tabela[5][23].

Aí aquele primeiro código do Campos de Minhoca torna-se:

scanf("%d %d", &n, &m);

natual=1;
while (natual<=n) {
matual=1;
while (matual<=m) {
scanf("%d", &valor[natual][matual]);
matual=matual+1;
}
natual=natual+1;
}

As variáveis [n,m]atual vão crescendo e preenchendo a tabela. :)

Só que acontece que se programássemos dessa maneira gastaríamos uma porção de códigos e ficaríamos confusos pra trabalhar com arrays, tendo que sempre verificar os índices e acabaríamos errando bastante. Então criou-se o for. O for é uma simplificação desse tipo de while. Você diz que:

para todo natual de 1 a n, faça:
alguma coisa
fim-para

Escrever for em Pascal é super divertido, porque você se sente falando com o computador:

for i:=1 to 100, do begin
código aqui
end;

No C existe uma sintaxe mais versátil, mas que pode ser um pouquinho mais difícil de entender no início:

for (atribuição; condição; incremento)

A atribuição é onde você coloca o primeiro valor do índice. A condição é a condição para que o enquanto continue funcionando. O incremento é o que ele deve fazer ao final de cada loop (geralmente é aumentar um).

Então, ao invés de fazer esse while:

indice=1;
while (indice<=1000) {
scanf("%d", &var[indice]);
indice=indice+1;
}

Você pode escrever:

for (indice=1; indice<=1000; indice=indice+1) {
scanf("%d", &var[indice]);
}

E como resolver a parte da entrada do Campos de Minhoca sabendo disso?

Simples... Basta colocar um for dentro do outro:

scanf("%d %d", &n, &m);

for (i=1; i<=n; i++) {
for (j=1; j<=m; j++) {
scanf("%d", &matriz[i][j]);
}
}

Observação 1: Escrever variavel++ é a mesma coisa que escrever variavel=variavel+1.

Observação 2: Geralmente utiliza-se i para o primeiro for, depois j, k, l e eu nunca tive que passar do l. :)

Observação 3: Se eu queria um vetor de 1000 posições lá em cima, por que eu declarei 1001? Bom... O C conta a partir de 0. Quando eu peço 1000, ele vai me dar um vetor de 0 a 999. Já que eu queria ter o var[1000] eu precisei declarar de 1000+1=1001.

Ficou claro ou muito confuso? Se deu pra entender isso aí, agora é só mandar a ver no resto do problema! :)

[tags]c, programming, language, obi, olimpíada, matemática, programação, algoritmos[/tags]

Batizado

Monday, January 22nd, 2007

Carol, do Mal Vicioso aqui só pra notificar que o sucessor do Teobaldo acabou de ser batizado. Seu nome é Flick, em homenagem ao personagem de Vida de Inseto.

[tags]pessoais, acer, laptop, flick, tiago, carol[/tags]