segunda-feira, 31 de agosto de 2009

Resolução da câmera digital e qualidade da imagem

Atualmente as câmeras de fotografia digitais conseguem produzir uma imagem de até 12 megapixels, ou até mais que isso. Entretanto muitas fontes de informação publicam conselhos mostrando a resolução ideal para cada tipo de consumidor, com a intenção de evitar o desperdício. Contudo não devemos nos prender a somente um tipo de uso, é possível que se possa um dia precisar de algo mais.

Semelhante a um mosaico, toda imagem digital é formada por minúsculos quadradinhos chamados pixels. Se ampliar o bastante qualquer imagem digital, os pixels poderão ser vistos. Cada pixel é formado por uma única cor e brilho, e milhões destes pixels quando combinados juntos formam uma imagem digital. Quanto mais pixels a imagem tiver, maior poderá ser a sua resolução para um determinado uso. Um milhão de pixels é igual a 1 megapixel (MP) e este número é formado multiplicando-se as dimensões da imagem, por exemplo 3264x2448 é igual a 7.990.272 pixels, aproximadamente 8 MP.

A necessidade do número de megapixel em uma imagem vai depender do destino desta imagem. Para a apresentação em um monitor de alta resolução (1680x1050), ou em uma TV FullHD (1920x1080), ou uma impressão tamanho 10x15cm em 300dpi, uma imagem de dois megapixels já é suficiente.

Quanto maior a resolução da imagem, maior poderá ser a sua ampliação numa impressão em papel. E apesar da apresentação em um monitor não obter melhorias com imagens de resoluções mais altas, durante a visualização de toda a imagem na tela, um número maior nos megapixels permitirá um maior efeito de aproximação da imagem, o conhecido zoom.

Abaixo apresento um teste que mostra a diferença de detalhe que uma imagem com maior resolução pode conseguir. As fotografias foram realizadas a 100 centímetros de distância do objeto sem utilizar qualquer efeito zoom da câmera e em resoluções de 8, 5, 3 e 1 megapixel. Perceba a melhoria na nitidez quando a resolução é maior.


É claro que as características da lente e do sensor da câmera são os principais fatores para a qualidade da imagem. Entretanto infelizmente nunca encontrei algum estudo que apresentasse qual o limite de resolução das pequeninas lentes usadas nas câmeras digitais. Esta é uma característica bastante divulgada quando se trata de telescópios, o poder de separação dos astros, mas para câmeras fotográficas nunca se fala. Pelo menos até 8 megapixels a qualidade melhora, não tornando a lente objetiva um fator limitador para isto.

Curiosamente, para uma câmera convencional estima-se que a qualidade do filme de 35 mm é de cerca de 20 milhões de pixels. Uma excelente resolução!

sábado, 29 de agosto de 2009

Problemas de lógica resolvidos com equações do 1º grau

Muitos dos problemas de lógica onde o enunciado apresenta relações entre valores numéricos podem ser resolvidos com o uso de equações do primeiro grau, ou equações lineares. Uma equação é toda sentença matemática aberta representada por uma igualdade, em que exista uma ou mais letras que representam números desconhecidos.

Se o problema é apresentado em uma sentença com palavras, para resolver devemos transformá-lo em uma sentença que esteja escrita em linguagem matemática, uma equação. Esta é a parte mais importante e talvez seja a mais difícil na resolução do problema.

Normalmente aparecem letras conhecidas como variáveis ou incógnitas. Então para resolver estas equações do primeiro grau, basta colocar as incógnitas de um lado do sinal de igualdade e os números do outro.

Veja alguns problemas resolvidos:

1) Um número mais a sua metade é igual a 150. Qual é esse número?

Solução:

n + n/2 = 150
(2n + n)/2 = 150
2n + n = 150 * 2
3n = 300
n = 300/3
n = 100

Resposta: Esse número é 100.

2) A diferença entre um número e sua quinta parte é igual a 36. Qual é esse número?

Solução:

x - x/5 = 36
(5x - x)/5 = 36
4x/5 = 36
4x = 36 * 5
4x = 180
x = 180/4
x = 45

Resposta: Esse número é 45.

3) O triplo de um número é igual a sua metade mais 20. Qual é esse número?

Solução:

3m = m/2 + 20
6m/2 = (m + 40)/2
6m = m + 40
6m - m = 40
5m = 40
m = 40/5
m = 8

Resposta: Esse número é 8.

4) O triplo de um número, mais 5, é igual a 254. Qual é esse número?

Solução:

3p + 5 = 254
3p = 254 - 5
3p = 249
p = 249/3
p = 83

Resposta: Esse número é 83.

5) O quádruplo de um número, diminuído de três, é igual a 99. Qual é esse número ?

Solução:

4n - 3 = 99
4n = 99 + 3
4n = 102
n = 102/4
n = 25,5

Resposta: Esse número é 25,5.

6) Júlio tem 15 anos e Eva tem 17 anos. Daqui a quantos anos a soma de suas idades será 72 anos?

Solução:

(15 + a) + (17 + a) = 72
32 + 2a = 72
2a = 72 - 32
2a = 40
a = 40/2
a = 20

Resposta: Será daqui a 20 anos.

7) Num pátio há bicicletas e carros num total de 20 veículos e 56 rodas. Determine o número de bicicletas e de carros.

Solução:

(b * 2) + (c * 4) = 56
b + c = 20

b = 20 - c
((20 - c) * 2) + 4c = 56
40 - 2c + 4c = 56
2c = 56 - 40
2c = 16
c = 16 / 2
c = 8
b = 20 - 8
b = 12

Resposta: Existem 12 bicicletas e 8 carros.

8) A metade dos objetos de uma caixa mais a terça parte desses objetos é igual a 75. Quantos objetos há na caixa?

Solução:

n/2 + n/3 = 75
(3n + 2n)/6 = 75
5n = 75 * 6
5n = 450
n = 450/5
n = 90

Resposta: Existem 90 objetos na caixa.

9) Em uma fábrica, um terço dos empregados são estrangeiros e 90 empregados são brasileiros. Quantos são os empregados da fábrica?

Solução:

2 * (e/3) = 90
2e = 90 * 3
2e = 270
e = 270/2
e = 135

outro exemplo,

2 * (e/3) = 90
e/3 = 90/2
e/3 = 45
e = 45 * 3
e = 135

Resposta: A fábrica possui 135 empregados.

10) Numa caixa, o número de bolas pretas é o triplo de bolas brancas. Se tirarmos 4 brancas e 24 pretas, o número de bolas de cada cor ficará igual. Qual a quantidade de bolas brancas?

Solução:

p = 3b
b - 4 = p - 24
b - 4 = 3b - 24
3b - b = 24 - 4
2b = 20
b = 20/2
b = 10

Resposta: 10 bolas brancas.

11) Como devo distribuir R$ 438,00 entre três pessoas, de modo que as duas primeiras recebam quantias iguais e a terceira receba o dobro do que receber as duas primeiras juntas?

Solucão:

p + p + 2*(p + p) = 438
2p + 2p + 2p = 438
6p = 438
p = 438/6
p = 73

Resposta: R$ 73,00 para cada uma das duas primeiras e R$ 292,00 para a terceira pessoa.

12) Ao triplo de um número foi adicionado 40. O resultado é igual ao quíntuplo do número. Qual é esse número?

Solução:

3n + 40 = 5n
5n - 3n = 40
2n = 40
n = 40/2
n = 20

Resposta: Esse número é 20.

13) Existem três números inteiros consecutivos com soma igual a 393. Que números são esses?

Solução:

x + (x + 1) + (x + 2) = 393
3x + 3 = 393
3x = 390
x = 130

Resposta: Os números procurados são: 130, 131 e 132.

14) A soma das idades de André e Carlos é 22 anos. Descubra as idades de cada um deles, sabendo-se que André é 4 anos mais novo do que Carlos.

Solução:

c + a = 22
c + (c - 4) = 22
2c - 4 = 22
2c - 4 + 4 = 22 + 4
2c = 26
c = 13

Resposta: Carlos tem 13 anos e André tem 9 anos.

sexta-feira, 28 de agosto de 2009

Funções Recursivas e Funções Iterativas

Em programação de softwares de computadores existem dois procedimentos que permitem que um código seja executado repetidamente, um é a função recursiva, onde em um dos passos do procedimento a função invoca-se à si própria, e o outro é a função iterativa, onde ocorre a repetição de um ou mais passos controlados por um laço de repetição.

Os dois procedimentos tem suas vantagens e desvantagens, que envolvem o consumo de memória, de processamento, tamanho e clareza do código etc. Não vou entrar aqui em detalhes quanto à análise da eficiência dos algoritmos, apenas quero apresentar as diferenças estruturais destes dois procedimentos.

Em ambos os casos, por serem procedimentos que realizam uma repetição de passos, é necessário que se tenha uma condição de parada, senão a repetição corre o risco de ser infinita.

A função iterativa utiliza comandos chamados laços de repetição para o controle do fluxo de execução, como o comando for ou while por exemplo, que dependem de uma condição ser verdadeira ou falsa para iniciar ou interromper a repetição.

A função recursiva realiza a repetição dos seus passos invocando à si própria, executando todos os seus passos novamente em uma chamada completamente independente da mesma função. Nesta segunda chamada a função pode invocar-se novamente e assim várias vezes até que uma estrutura de controle encerre esta ação, e então cada retorno é recebido pelas funções anteriores de forma cumulativa.

Segue abaixo versões iterativas e recursivas das soluções de alguns problemas mais conhecidos:

Fatorial de um número, versão iterativa, em VBA:

Public Function FATO(numero As Integer) As Integer

Dim fatorial As Integer
fatorial = 1
For i = 1 To numero
fatorial = fatorial * i
Next
FATO = fatorial

End Function


Fatorial de um número, versão recursiva, em VBA:

Public Function FATO(numero As Integer) As Integer

If numero <= 1 Then
FATO = 1
Else
FATO = numero * FATO(numero - 1)
End If

End Function



Número de Fibonacci, versão iterativa, em VBA:

Public Function FIBONACCI(posicao As Integer) As Long

Dim anterior, atual, proximo As Long
Dim contador As Integer

If posicao = 1 Or posicao = 2 Then
FIBONACCI = 1
ElseIf posicao >= 3 Then
anterior = 1
atual = 1
For contador = 3 To posicao
proximo = anterior + atual
anterior = atual
atual = proximo
Next
FIBONACCI = atual
Else
FIBONACCI = 0
End If

End Function


Número de Fibonacci, versão recursiva, em VBA:

Public Function FIBONACCI(posicao As Integer) As Long

If posicao >= 3 Then
FIBONACCI = FIBONACCI(posicao - 1) + FIBONACCI(posicao - 2)
Else
FIBONACCI = 1
End If

End Function



Pesquisa binária, versão iterativa, em Java:

public static int pesqbinite(int[] vetor, int valor) {

int esq = 0;
int dir = vetor.length - 1;
int meio;

while ( esq <= dir ) {
meio = (esq + dir) / 2;
if ( vetor[meio] < valor ) {
esq = meio + 1;
} else if( vetor[meio] > valor ) {
dir = meio - 1;
} else {
return meio;
}
}
return -1;
}


Pesquisa binária, versão recursiva, em Java:

public static int pesqbinrec(int[] vetor, int pi, int pf, int valor){

int meio = ((pf - pi) / 2) + pi;

if (vetor[meio] == valor) {
return meio;
} else if ((vetor[meio] < valor) && (valor <= vetor[pf])) {
pi = meio + 1;
return pesqbinrec(vetor,pi,pf,valor);
} else if ((vetor[meio] > valor) && (valor >= vetor[pi])) {
pf = meio;
return pesqbinrec(vetor,pi,pf,valor);
} else {
return -1;
}
}

O erro do nome GNU/Linux

Uma discussão bastante pertinente no mundo do software livre é em relação ao nome correto para o sistema operacional Linux. A disputa está entre chamar de somente Linux ou de GNU/Linux. Para apresentar o meu ponto de vista, que é a favor de usar somente Linux, vou antes introduzir alguns fatos históricos.

O Projeto GNU é um projeto iniciado por Richard Stallman em 1984, com o objetivo de criar um sistema operacional totalmente livre. A partir desta data, Stallman e vários programadores que abraçaram a causa, vieram desenvolvendo as peças principais de um sistema operacional, como compilador de linguagem C, editores de texto, etc.

Um ano após foi fundada, por Stallman, a Free Software Foundation, uma organização sem fins lucrativos que se dedica à eliminação de restrições sobre a cópia, redistribuição, entendimento e modificação de programas de computadores. E em Janeiro de 1989 Richard Stallman publicou a primeira versão da GNU General Public License, ou simplesmente GPL, que é a designação da licença para software livre no âmbito do Projeto GNU da Free Software Foundation.

Em 1991 apareceu oficialmente o Linux, que é um núcleo de sistema operacional, desenvolvido pelo finlandês Linus Torvalds. E logo no início o seu código fonte foi disponibilizado sob a GPL para qualquer pessoa que utilizar, estudar, modificar e distribuir de acordo com os termos da licença.

Neste momento do desenvolvimento do Linux, vários aplicativos já vinham sendo reunidos pelo Projeto GNU da Free Software Foundation e só estavam à espera de um núcleo, do subprojeto GNU Hurd. Porém devido a demora em desenvolver o Hurd, Stallman acabou adotando o núcleo Linux como base para distribuir os programas do Projeto GNU, e ao mesmo tempo diversas pessoas e instituições tiveram a mesma idéia, assim várias distribuições começaram a surgir baseadas no núcleo desenvolvido inicialmente por Linus.

Agora começa minha argumentação. Apesar do Projeto GNU ter a intenção de desenvolver um sistema operacional, na realidade o projeto produziu quase nada, poucos softwares são realmente de autoria dos integrantes do projeto, a grande maioria dos softwares são desenvolvidos por terceiros que adotaram a GPL para a disponibilização, do mesmo modo o núcleo Linux. O Projeto GNU não tem uma distribuição de um sistema operacional desenvolvida por eles, tem apenas softwares isolados, disponíveis sob a GPL, que se agrupados podem compor um sistema operacional.

O núcleo Linux não foi criado pelo Projeto GNU, Linus Torvalds apenas adotou a GPL para disponibilizar o software. O Projeto GNU pode sim ter alguma colaboração com o crescimento do núcleo Linux, assim como existem milhares de programadores ao redor do mundo e inclusive empresas privadas as quais participam do desenvolvimento do núcleo Linux. Deste modo pode-se dizer que o Linux é de todos, o nome é de propriedade de Linus Torvalds mas o código é livre para todos, seguindo os termos da GPL.

Existem diversas distribuições que utilizam o núcleo Linux e diversos outros softwares que estão sob a GPL. Nenhuma destas distribuições é do Projeto GNU, apenas a licença para software livre do Projeto GNU que é utilizada para a distribuição dos softwares. E inclusive muitos softwares contidos em várias distribuições estão sob outra licença.

Então, no meu ponto de vista é errado dizer GNU/Linux, pois o núcleo Linux é do Linus Torvalds e o Projeto GNU apenas desenvolveu a licença para a disponibilização. Além do mais não se fala EPL/Eclipse ou CDDL/OpenSolaris. Até poderiam, pois existem softwares que são desenvolvidos diretamente por seus respectivos projetos, como o Mozilla Firefox com sua licença MPL e o Apache Tomcat da Fundação Apache.

quinta-feira, 27 de agosto de 2009

Shell Script para procura e download de novos arquivos

Na manutenção do meu sistema Linux eu tenho o hábito de fazer o download de todos os pacotes disponíveis no repositório Updates, para então atualizar o que for necessário. Não costumo usar o utilitário yum pois gosto de fazer o download de tudo e não somente das atualizações dos pacotes que estão instalados. Aliás este meu procedimento vem muito antes de existirem estes utilitários que facilitam a atualização de pacotes.

Para facilitar a vida e não ter que fazer todo o trabalho manualmente, desenvolvi um script para o Shell que faz tudo automaticamente. O script é capaz de verificar os pacotes que eu já tenho e selecionar os novos pacotes disponíveis no repositório, aplicando antes um filtro para retirar os pacotes que eu não desejo. Por fim realiza o download dos arquivos.

Para facilitar o entendimento do código do script é necessário descrever o meu cenário. Porém isto é só um exemplo já que a idéia deste artigo é mostrar a possibilidade de um script de pesquisa e download automáticos.

Dentro do meu diretório pessoal (home) existe um diretório (~/Fedora), no qual fica o script, e dentro dele há o diretório Updates que contém os pacotes recebidos por download. Na raiz do meu diretório pessoal existem os arquivos com os hashes MD5 dos arquivos que já foram gravados em DVD e que não estão mais no HD.

O script lê o conteúdo dos arquivos com os hashes, lista o conteúdo do diretório Updates e grava no arquivo "pacotes-que-ja-tem.txt". Em seguida lista o conteúdo do repositório e grava no arquivo "pacotes-no-repo-updates.txt". Para estes dois arquivos há um tratamento para retirar as informações extras e deixar somente os nomes dos pacotes.

Com estas duas listagens é feita uma comparação para verificar as diferenças e, após, aplica o filtro para retirar os pacotes que estão na lista negra. Neste ponto está pronto o arquivo "pra-baixar.txt" que contém a listagem dos pacotes novos.

Na interface com o usuário é apresentada a estatística com a contagem dos novos pacotes e o conteúdo da listagem. Antes de realizar o download o script faz uma pergunta para confirmar. Caso a resposta seja positiva, é feito o download dos pacotes dentro do diretório Updates.

Veja o código do script:

#!/bin/bash

sed 's/^.\{34\}//' ~/hash*.md5 | grep "Updates/" | sed 's/.*\///g' - > updates-baixados.txt

ls ~/Fedora/Updates/ >> updates-baixados.txt

sort updates-baixados.txt > pacotes-que-ja-tem.txt

lynx -dump ftp://download.fedora.redhat.com/pub/fedora/linux/updates/10/i386/ | awk '{print $2}'
| grep .rpm | sed 's/.*\///g' - | sort > pacotes-no-repo-updates.txt

diff pacotes-no-repo-updates.txt pacotes-que-ja-tem.txt | grep "< " | sed 's/< //' - > novidades.txt

diff novidades.txt lista-negra.txt | grep "< " | sed 's/< //' - > pra-baixar.txt

NOVO=`wc -l novidades.txt | awk '{print $1}'`
NEGRA=`wc -l lista-negra.txt | awk '{print $1}'`
BAIXAR=`wc -l pra-baixar.txt | awk '{print $1}'`

echo "Pacotes novos: ${NOVO}"
echo "Pacotes na lista negra: ${NEGRA}"
echo "Pacotes para baixar: ${BAIXAR}"
echo
echo "Listagem:"
echo
cat pra-baixar.txt
echo

if [ ! -s pra-baixar.txt ]; then
echo "Nada para baixar."
else
read -p "Deseja baixar os pacotes? (s/n) " ans
if [ "$ans" == 's' ]; then
POS=1
cd ~/Fedora/Updates/
while read PACOTE
do
echo -e "\n------------------- Baixando pacote ${POS} de ${BAIXAR} ------------------\n"
wget -c -T60 ftp://download.fedora.redhat.com/pub/fedora/linux/updates/10/i386/"$PACOTE"
POS=$((POS+1))
done < ../pra-baixar.txt
cd ..
echo -e "\nFeito!\n"
elif [ "$ans" == 'n' ]; then
echo -e "\nDesistindo...\n"
else
echo -e "\nResposta invalida.\n"
fi
fi

rm -f updates-baixados.txt pacotes-que-ja-tem.txt pacotes-no-repo-updates.txt novidades.txt pra-baixar.txt


O código é até feio visualmente, talvez mal estruturado, porém faz muito bem o que é para ser feito. E lembrando, apesar do script ser para buscar as atualizações da distro Fedora, é possível modificá-lo para atender a qualquer outro repositório de arquivos.

quarta-feira, 26 de agosto de 2009

Velocidade de escape, horizonte de eventos e gravidade

A velocidade de escape é a velocidade mínima que um objeto sem propulsão precisa para sair de um campo gravitacional, em vez de voltar ou ficar em órbita. Quanto mais próximo do centro gravitacional mais alta será a velocidade de escape.

Todos os objetos em um mesmo campo gravitacional tem a mesma velocidade de escape, não importa se a massa é 1 kg ou 1000 kg, a velocidade de escape é sempre a mesma. O que modifica a velocidade de escape é a distância do objeto ao centro gravitacional ou a grandeza da força gravitacional.

Na superfície terrestre a velocidade de escape é cerca de 11,2 km/s e a 9.000 km de altitude, na atmosfera terrestre, é pouco menor que 7,1 km/s. Na Lua, em sua superfície, a velocidade de escape é cerca de 2,4 km/s.

O horizonte de eventos é uma fronteira imaginária ao redor de um buraco negro a partir da qual a força da gravidade é tão grande que nem a própria luz consegue escapar de seu interior. No horizonte de eventos a velocidade de escape é igual à velocidade da luz.

A gravidade é a força de atração que existe entre todas as partículas com massa no universo. Quanto maior a massa de um objeto maior será a sua força gravitacional. E quanto mais distante estiver um objeto do outro, mais fraca será a força da gravidade. Porém a gravidade nunca chegará a zero, por mais distante que esteja, a gravidade será extremamente fraca.

A crise segundo Albert Einstein

"Não pretendemos que as coisas mudem, se sempre fazemos o mesmo. A crise é a melhor benção que pode ocorrer com as pessoas e países, porque a crise traz progressos. A criatividade nasce da angústia, como o dia nasce da noite escura. É na crise que nascem as invenções, os descobrimentos e as grandes estratégias. Quem supera a crise, supera a si mesmo sem ficar "superado".

Quem atribui à crise seus fracassos e penúrias, violenta seu próprio talento e respeita mais aos problemas do que às soluções. A verdadeira crise, é a crise da incompetência. O inconveniente das pessoas e dos países é a esperança de encontrar as saídas e soluções fáceis. Sem crise não há desafios, sem desafios, a vida é uma rotina, uma lenta agonia. Sem crise não há mérito. É na crise que se aflora o melhor de cada um. Falar de crise é promovê-la, e calar-se sobre ela é exaltar o conformismo. Em vez disso, trabalhemos duro. Acabemos de uma vez com a única crise ameaçadora, que é a tragédia de não querer lutar para superá-la"