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"

sábado, 22 de agosto de 2009

Notação de Knuth para números inteiros gigantes

Na matemática, a notação de Knuth é um sistema de representação para números inteiros muito grandes. Foi desenvolvida pelo matemático americano Donald Knuth em 1976. Está fortemente relacionada com a função Ackermann e seu conceito é baseado em exponenciação iterativa, do mesmo modo que exponenciação é semelhante à multiplicação iterativa e multiplicação é similar à adição iterativa.

A notação utiliza setas apontando para cima (↑) entre os números, daí o nome original em inglês "Knuth's up-arrow notation". Neste texto usarei o caractere | para representar a seta para cima.

Um operador de uma única seta para cima é o mesmo que exponenciação. Uma multiplicação de n termos do número m:

m|n = m x m x ... x m = m^n

Duas setas para cima juntas representam uma torre de potências. Uma torre de altura n, ou simplesmente m elevado à potência por ele mesmo, n vezes, incluindo a base até o expoente mais superior:

m||n = m|m|m|...|m = m^m^m^...^m

A operação de duas setas é uma função exponencial iterada conhecida como tetração que rapidamente gera números enormes. Por exemplo:

2||2 = 2|2 = 4
2||3 = 2|2|2 = 2|4 = 16
2||4 = 2|2|2|2 = 2|16 = 65536
3||2 = 3|3 = 27
3||3 = 3|3|3 = 3|27 = 7625597484987
3||4 = 3|3|3|3 = 3|3|27 = 3^7625597484987

Três setas para cima juntas representam uma operação vastamente mais poderosa, é uma torre de potências de uma torre de potências, é uma iteração de n termos m em uma operação de tetração:

m|||n = m||m||...||m

Por exemplo:

2|||2 = 2||2 = 4
2|||3 = 2||2||2 = 2||4 = 65 536
2|||4 = 2||2||2||2 = 2||65536 = 2|2|...|2 (65 536 termos)
3|||2 = 3||3 = 7625597484987
3|||3 = 3||3||3 = 3||7625597484987 = 3|3|...|3 (uma torre de 7625597484987 camadas de altura)
3|||4 = 3||3||3||3 = 3||3||7625597484987 = 3||3|...|3 (uma torre de 3||7625597484987 camadas de altura)

Similarmente avança-se para um operador quatro setas para cima, onde seguindo a regra geral, um operador n-setas se expande em operadores (n-1)-setas, com n termos m:

m||||n = m|||m|||...|||m

Por exemplo:

2||||2 = 2|||2 = 4
2||||3 = 2|||2|||2 = 2|||4 = 2|2|...|2 (65536 termos)
2||||4 = 2|||2|||2|||2 = 2|||2|2|...|2 (65536 termos)
3||||2 = 3|||3 = 3|3|...|3 (7625597484987 termos)
3||||3 = 3|||3|||3 = 3|||3|3|...|3 (7625597484987 termos) = 3||3|3|...|3 (3|3|...|3 (7625597484987 termos) termos)

A notação de Knuth pode se expandir de uma forma incrivelmente longa, se tornando maçante, mas é uma forma mais prática de representar números inteiros extremamente grandes, como os que são retornados pela função de Ackermann:

A(4,2) = 2||5 - 3 = 2^65536 - 3 = um número com 19729 dígitos decimais!

A importância da cópia de segurança

Na informática, a cópia de segurança, ou "backup", é a cópia dos arquivos de um dispositivo de armazenamento à outro para que possam ser restaurados em caso da perda dos arquivos originais, quando há falha no hardware, apagamentos acidentais, pane no sistema operacional ou vírus.

Para um usuário doméstico as opções mais comuns de dispositivos de armazenamento que podem ser usadas para guardar a cópia de segurança são o CD, o DVD, o pendrive e o HD externo. Em ordem de capacidade de armazenamento no CD cabem apenas 700 MB, no DVD cabem 4,7 ou 8,4 GB, os pendrives mais comuns são de 1 GB à 32 GB e os HDs externos variam de 80 GB ou mais.

A escolha do dispositivo ideal para sua cópia de segurança vai depender do tamanho dos arquivos, do tempo que as cópias devem ser mantidas e também do preço do produto, um CD custa bem barato e dura por muitas décadas mas pode não ter espaço suficiente para seus arquivos. Porém nada impede de se usar mais de uma mídia.

Outro detalhe importante é no momento da cópia dos arquivos. Não é muito aconselhável utilizar sempre o mesmo dispositivo de armazenamento nas operações de cópia, principalmente em casos de CDs e DVDs regraváveis (CD-RW e DVD-RW) onde é necessário limpá-los antes de cada cópia. Justamente no momento que a mídia estiver limpa você não terá cópia de segurança alguma! Nestes casos é recomendável ter pelo menos duas mídias, usando-as alternadamente, enquanto uma está sendo preparada, a outra mantém uma cópia de segurança.

Pendrives e HDs externos também correm riscos quando estão conectados ao computador. Se seu sistema ficar infectado com algum vírus e você não perceber, no momento que o dispositivo for conectado ao seu computador o vírus poderá infectar os arquivos no pendrive e no HD externo. Uma pane elétrica também pode comprometer a saúde de todos os seus equipamentos quando eles estão conectados entre si.

Importante reforçar, sempre tenha uma cópia de segurança anterior à que você estiver realizando. Por este motivo que pendrives e HDs externos não são muito seguros se tiver apenas um para ser utilizado. O ideal é utilizar mídias que, uma vez gravadas, não serão utilizadas no dia a dia, e os CDs e DVDs são perfeitos para isso.

A periodicidade das cópias de segurança deve ser analisada em função da quantidade de arquivos alterados em seu computador, se o volume for elevado as cópias devem ser diárias. Uma situação como exemplo é a cada dia realizar cópias para o seu pendrive e quando tiver uma quantidade suficiente para encher um DVD, faz então a cópia para um DVD, e recomeça no dia seguinte a usar o pendrive até o próximo DVD.

Mas dentre todos os arquivos existentes em seu computador, o que é necessário ter em cópia de segurança? Basicamente os arquivos produzidos diretamente por você, por exemplo, documentos produzidos em um editor de texto, em um editor de planilha eletrônica, fotos carregadas da sua câmera digital, arquivos baixados pela internet, músicas etc. Além destes também deve-se incluir os arquivos variáveis dos softwares que você utiliza, como os favoritos do seu navegador, os seus e-mails, os "savegames" dos seus jogos, sua agenda de endereços, contatos etc.

O que não é necessário guardar em cópia de segurança são os arquivos do sistema operacional e os softwares instalados, pois estes serão automaticamente restaurados se houver a necessidade da reinstalação de todo o sistema.

Lembre-se, o computador não é eterno e quando ele parar vai ser confortante saber que seus arquivos importantes estão guardados em um lugar seguro. Faça sempre cópias de segurança!

sexta-feira, 21 de agosto de 2009

Função Ackermann

Uma das mais importantes funções na ciência da computação. Sua maior propriedade é que ela cresce surpreendentemente rápido pois esta função eleva seu retorno rapidamente para números muito grandes, denominados números Ackermann e que normalmente são representados em uma notação inventada por Donald Knuth, a notação "up-arrow" ou notação de Knuth.

A função Ackermann foi descoberta e estudada por Wilhelm Ackermann em 1928. A função que ele descobriu, que então recebeu seu nome, é um simples exemplo de uma função total e bem definida que pode ser computável mas não é uma recursão primitiva. "Total e bem definida" significa que a função é internamente consistente e não quebra as regras das instruções que a define. "Computável" significa que ela pode, em princípio, ser avaliada por todos os valores possíveis em suas variáveis. "Recursão primitiva" significa que pode ser computada usando somente laços for, repetindo a operação em um número de vezes predeterminado. A função Ackermann somente pode ser calculada usando o laço de repetição while, que repete a ação até que o teste da condição retorne falso.

A função Ackermann é definida recursivamente para números inteiros não negativos, m e n, como:

          n + 1                  se m = 0
A(m, n) = A(m - 1, 1) se m > 0 e n = 0
A(m - 1, A(m, n - 1)) se m > 0 e n > 0


Dois inteiros positivos, m e n, são a entrada e A(m ,n) é a saída sendo outro inteiro positivo. A função pode ser programada facilmente em apenas poucas linhas de código. O problema não é a complexidade da função mas sua terrível taxa de crescimento. Por exemplo uma inocente entrada A(4,2) retorna um número de 19.729 dígitos:

A(0, n) = n + 1
A(1, n) = 2 + (n + 3) - 3
A(2, n) = 2 × (n + 3) - 3
A(3, n) = 2^(n + 3) - 3
A(4, n) = 2^(2^(...^2)) - 3 (n + 3 números dois)
A(5, n) = 2^(2^(...^2))^(2^(2^(...^2)))^(...^(2^(2^(...^2)))) - 3

Por isso o uso de uma grafia especial para números grandes como a notação de Knuth é indispensável, como mostra o exemplo abaixo:

A(4, n) = 2^^(n + 3) - 3
A(5, n) = 2^^^(n + 3) - 3

Como podem perceber, a função Ackermann estabelece adições iterativas e multiplicações iterativas, efetuando potências dentro de potências, recursivamente (potências iterativas). Alguns resultados da função Ackermann para as entradas m e n são mostrados abaixo:

                             n
0 1 2 3 4 5
0 1 2 3 4 5 6
m 1 2 3 4 5 6 7
2 3 5 7 9 11 13
3 5 13 29 61 125 253
4 13 65533 2^65536 -3 2^2^65536 -3 ...
5 65533 ...


O código para a função Ackermann é bastante simples, abaixo dois exemplos em java que aplicam a função:

public static long acker(long m, long n) {
if(m == 0) {
return n + 1;
} else if(n == 0) {
return acker(m-1, 1);
} else {
return acker(m-1, acker(m, n-1));
}
}


Ou:

public static long acker(long m, long n) {
return (m == 0) ? (n + 1) : ((n == 0) ? acker(m-1, 1) : acker(m-1, acker(m, n-1)));
}


A função Ackermann devido a sua característica de recursão extremamente profunda pode ser usada como teste de medida da capacidade de um compilador otimizar a recursão.

Veja mais em:

http://mathworld.wolfram.com/AckermannFunction.html
http://rosettacode.org/wiki/Ackermann_Function
http://planetmath.org/encyclopedia/AckermannFunction.html
http://kosara.net/thoughts/ackermann.html

quarta-feira, 19 de agosto de 2009

Problema de Lógica: Cor dos Olhos

Atenção, resposta logo após o problema!

Um grupo de pessoas com olhos de diferentes cores mora numa ilha. Elas são perfeitas em seus pensamentos lógicos, se uma conclusão pode ser deduzida logicamente, elas a farão instantaneamente. Ninguém sabe a cor de seus próprios olhos. Toda noite, à meia-noite, uma balsa chega na ilha. Qualquer uma que descobrir a cor de seus próprios olhos deixa a ilha e o resto fica. Qualquer uma pode ver qualquer uma o tempo todo e sabem a contagem do número de pessoas que elas veem com cada cor dos olhos (excluindo a si próprias), mas elas não podem se comunicar. Todos na ilha conhecem as regras deste parágrafo.

Nessa ilha há 100 pessoas de olhos azuis, 100 pessoas de olhos castanhos e a Guru (ela tem olhos verdes). Então, qualquer pessoa de olhos azuis pode ver 100 pessoas de olhos castanhos e 99 de olhos azuis (e uma de olhos verdes), mas isso não lhe diz a cor de seus próprios olhos. Podem imaginar que os totais são 101 castanhos e 99 azuis, ou 100 castanhos, 99 azuis e ela pode ter olhos vermelhos.

A Guru pode falar apenas uma vez (digamos, ao meio-dia) em um único dia de toda eternidade delas na ilha. Em pé em frente aos habitantes da ilha, ela diz o seguinte:

"Eu posso ver alguém que tem olhos azuis."

Quem deixa a ilha, e em que noite?

Lá não há espelhos ou superfícies refletivas. Não é uma pegadinha e a resposta é lógica. Não depende de truque de palavras ou alguém mentindo ou supondo e não envolve pessoas fazendo coisas como comunicação por sinais etc. A Guru não fez sinal com os olhos para alguém em particular, ela simplesmente disse "eu contei pelo menos uma pessoa de olhos azuis nesta ilha que não sou eu".

E finalmente, a resposta não é "ninguém deixou a ilha".




RESPOSTA




Todas as pessoas de olhos azuis deixarão a ilha na centésima noite.

Se você considerar o caso de haver apenas uma pessoa de olhos azuis na ilha, você pode ver que ela deixará a ilha na primeira noite, porque ela saberá que é a única de quem a Guru deve estar falando. Ela olha ao seu redor e não vê alguém mais e sabe que pode sair. Então: [TEOREMA 1] Se tiver uma pessoa de olhos azuis, ela deixará a ilha na primeira noite.

Se neste lugar haver duas pessoas de olhos azuis, elas se olharão uma a outra. Cada uma delas pensará "Se eu não tenho olhos azuis [HIPÓTESE 1], então esta pessoa é a única que tem. E se ela é a única, pelo TEOREMA 1 ela deixará a ilha nesta noite.". Cada uma delas esperará para ver e quando nenhuma delas deixar a ilha na primeira noite, cada uma pensará "Minha HIPÓTESE 1 estava incorreta. Eu devo ter olhos azuis.". E as duas sairão na segunda noite. Então: [TEOREMA 2] Se tiver duas pessoas de olhos azuis, cada uma delas deixará a ilha na segunda noite.

Se neste lugar haver três pessoas de olhos azuis, cada uma olhará as outras duas e atravessará um processo similar ao anterior. Cada uma considerará duas possibilidades: "Eu tenho olhos azuis." ou "Eu não tenho olhos azuis.". Ela saberá que se não tiver olhos azuis, terá somente duas pessoas de olhos azuis na ilha, as duas que ela vê. Então ela pode esperar duas noites, e se ninguém deixar, ela saberá que deve ter olhos azuis: TEOREMA 2 diz que se ela não tiver, as outras pessoas terão de sair. Quando ela ver que as outras não deixaram, ela saberá que seus próprios olhos são azuis. Todas as três estão no mesmo processo, então todas elas deduzirão no dia 3 e deixarão a ilha.

Esta indução pode continuar adiante até o TEOREMA 99, no qual qualquer pessoa envolvida na ilha saberá imediatamente. Cada uma delas esperará 99 dias, verão que o resto do grupo não foi a lugar algum, e na centésima noite todas deixarão a ilha.

segunda-feira, 17 de agosto de 2009

Editor de texto sed

sed é um "Stream EDitor" ou editor de fluxo, bastante leve para linha de comando. Um editor de fluxo é um programa usado para executar transformações básicas em textos recebidos de uma entrada em fluxo, pode ser vindo de um arquivo ou da entrada padrão.

O sed trabalha com somente uma passagem sobre a entrada, tornando-o assim mais eficiente. Mas é a habilidade de filtragem de texto em um redirecionamento da saída para a entrada padrão, canalização, que o distingue dos outros tipos de editores.

A característica principal do sed é poder editar arquivos automaticamente. É um editor de textos não interativo, ele pode editar automaticamente, sem interação do usuário, vários arquivos seguindo um conjunto de regras especificadas. É como uma edição em "lote".

O sed é um editor de fluxo que está incluído em quase todos os sabores de UNIX, incluindo o Linux. Entretanto as distribuições do Linux contém o GNU sed, uma versão melhorada com muitas extensões úteis que economizam tempo ao padrão sed POSIX e também não sofre as muitas limitações que versões anteriores e proprietárias do sed tinham.

O sed trabalha executando qualquer número de operações de edição especificadas pelo usuário nos dados de entrada. O sed é baseado em linhas, assim os comandos são executados em cada linha, em ordem. E o sed escreve o resultado na saída padrão, ele não modifica nenhum arquivo de entrada.

Abaixo apresento alguns exemplos de uso do sed. Dentre eles alguns exemplos com o uso do sed combinado com outros programas para que tenha algo mais prático e assim entender melhor a utilidade do sed:

Substitui em cada linha de arquivo.txt as palavras "assim" para "assado":
sed 's/assim/assado/g' arquivo.txt

Substitui somente nas linhas que encontrar a string as palavras "assim" para "assado":
sed '/string/s/assim/assado/g'

Remove os 34 primeiros caracteres a partir do início de cada linha:
sed 's/^.\{34\}//' hash.md5 > arquivo.txt

Remove desde o início de cada linha até a última / encontrada
sed 's/^.*\///' caminhos.txt > sonomes.txt

Renomeia todos os arquivos .doc trocando _ e - por espaços:
for i in `ls *.doc`; do mv $i "`echo $i | sed 's/_/ /g; s/-/ /g'`"; done

Remove em arquivo.txt a linha 1 até a 28:
sed '1,28d' arquivo.txt > outro_arquivo.txt

Remove todas as linhas em branco:
sed '/^$/d' arquivo_com_linhas_em_branco.txt | sort > arquivo_limpo.txt

Remove todas as linhas que contenham a string:
sed '/string/d' arquivo.txt

Renomeia todos os arquivos de letras maiúsculas para minúsculas:
for i in `ls *.*`; do mv $i `echo $i | sed 'y/ABCDEFGHIJKLMNOPQRSTUVWXYZÀÁÂÃÄÅÈÉÊËÌÍÎÏÒÓÔÕÖÙÚÛÜÇÑ/abcdefghijklmnopqrstuvwxyzàáâãäåèéêëìíîïòóôõöùúûüçñ/'`; done

Remove todas as tags HTML:
sed 's/<[^>]*>//g' arquivo.html > arquivo.txt

Adiciona um texto no início de cada linha:
sed 's/^/texto incluido/' arquivo.txt

Adiciona um texto no final de cada linha:
sed 's/$/texto incluido/' arquivo.txt

domingo, 16 de agosto de 2009

Feliz Aniversário Debian!

Há dezesseis anos atrás Ian Murdock anunciou a "iminente finalização para um lançamento de uma nova marca de Linux". Este lançamento estava sendo chamado de Debian Linux e foi o começo de uma das mais populares distribuições de Linux mantidas pela comunidade. Mais recentemente tornou-se a base para a distribuição Ubuntu. O Debian GNU/Linux é conhecido por seu comprometimento de sua comunidade à filosofia do software livre.

O Debian é um sistema operacional livre para seu computador. Um sistema operacional é um conjunto de programas básicos e utilitários que fazem seu computador funcionar. O Debian usa o kernel (núcleo de um sistema operacional) Linux, mas a maior parte das ferramentas do sistema operacional vêm do projeto GNU, daí o nome GNU/Linux.

O Debian GNU/Linux é mais que um simples sistema operacional, ele vem com mais de 25113 pacotes contendo softwares pré-compilados e distribuídos em um bom formato, que torna fácil a instalação deles na sua máquina.

É uma das primeiras distribuições a aparecer no planeta e o Debian está entre as mais importantes distribuições de Linux. Veja mais neste endereço: http://www.debian.org/

A pronúncia oficial de Debian é "débian". O nome vem do nome do criador do Debian, Ian Murdock, e sua esposa, Debra.

Feliz Aniversário Debian!

sexta-feira, 14 de agosto de 2009

O catálogo de Messier

Os objetos Messier são uma seleção de objetos astronômicos que foram primeiramente listados pelo astrônomo francês Charles Messier em seu "Catalogue des Nébuleuses et des Amas d'Étoiles", publicado em 1781. A original motivação para o catálogo foi que Messier era um caçador de cometas e ficou frustrado pelos objetos que pareciam mas não eram cometas. Ele então compilou uma lista destes objetos, em colaboração com seu assistente Pierre Méchain.

A primeira edição cobriu 45 objetos numerados de M1 à M45. A listagem total publicada por Messier continha 103 objetos mas a lista recebeu acréscimos sucessivos de outros astrônomos. O primeiro acréscimo foi de Camille Flammarion em 1921, adicionando o M104. Os objetos M105 ao M107 foram adicionados por Helen Sawyer Hogg em 1947, M108 e M109 por Owen Gingerich em 1960 e M110 por Kenneth Glyn Jones em 1966.

Todo os objetos Messier são visíveis através de binóculos ou de pequenos telescópios, portanto eles são bastante populares nas examinações dos astrônomos amadores.

Este catálogo de objetos é uma das mais famosas listas de objetos astronômicos e apesar destes objetos estarem também catalogados em outras listas mais modernas, muitos objetos Messier ainda são referenciados pelo seu número Messier.

A lista contém galáxias, aglomerados estelares e nebulosas. Dentre os objetos, alguns deles são: a Nebulosa do Caranguejo (M1) na constelação de Touro, a Galáxia de Andrômeda (M31) na constelação de Andrômeda, a Nebulosa de Órion (M42) na constelação de Órion e Plêiades (M45) na constelação de Touro.

Abaixo duas imagens com as fotografias e um mapa dos 110 objetos Messier:



quinta-feira, 13 de agosto de 2009

Efeito Droste

O efeito Droste é um termo holandês para um tipo específico de imagem recursiva. Uma imagem exibindo o efeito Droste contém uma cópia pequena da própria imagem sendo exibida em uma determinada posição de seu interior. E esta cópia pequena também exibe uma outra cópia menor ainda na mesma posição e assim sucessivamente.

Somente na teoria este efeito avança infinitamente pois a continuidade avança enquanto o limite da resolução da imagem permitir e o efeito é curto pois reduz exponencialmente o tamanho da imagem a cada iteração.

A primeira aparição deste efeito recursivo foi em 1900 na embalagem do pó de cacau da marca Droste, por isso o nome do efeito. Nesta embalagem aparece uma enfermeira servindo em uma bandeja uma xícara e a embalagem do mesmo pó de cacau.


Veja algumas imagens com o efeito Droste:




quarta-feira, 12 de agosto de 2009

Juntando arquivos linha a linha no Linux

Digamos que você tenha um arquivo (ex. letras.txt) que contenha:

a
b
c

E outro arquivo (ex. numeros.txt) que contenha:

1
2
3

E você quer unir estes arquivos para que o resultado fique:

a 1
b 2
c 3

Para isso existe um programa de linha de comando no Linux que é o paste, do pacote coreutils. O paste é capaz de unir linhas de arquivos. Por exemplo:

paste letras.txt numeros.txt > unidos.txt

Por padrão o paste separa os campos por tabulações mas você pode facilmente mudar isto adicionando o argumento -d. Por exemplo:

paste letras.txt numeros.txt -d , > unidos.txt

Resulta em um arquivo delimitado por vírgulas, ou seja, CSV (comma separated value):

a,1
b,2
c,3

terça-feira, 11 de agosto de 2009

Softwares matemáticos poderosos

Um sistema de álgebra computacional é um programa de computador que facilita o cálculo na matemática simbólica, incluindo deste as mais simples operações aritméticas até os mais avançados cálculos numéricos.

Os sistemas de álgebra computacional começaram a aparecer no início da década de 1960 e atualmente os líderes de mercado são o Maple e o Mathematica, sendo ambos freqüentemente usados por matemáticos, pesquisadores, cientistas e engenheiros.

Abaixo segue uma apresentação dos principais softwares de álgebra computacional, alguns comerciais e outros gratuitos mas todos completos o suficiente para oferecer uma poderosa ferramenta nas diversas áreas da matemática:

MATLAB

O MATLAB é um software interativo de alto nível, desenvolvido pela MathWorks, voltado para desenvolvimento de algoritmo, análise de dados e computação numérica. Com o MATLAB é possível resolver problemas computacionais mais rápido do que com o uso das linguagens de programação tradicionais, como C, C++ e Fortran.

O MATLAB pode ser usado para uma grande variedade de aplicações dentre diversas áreas científicas. Dentre suas funcionalidades estão a linguagem de alto nível, gerenciamento de dados, funções matemáticas para álgebra linear, estatística, otimização e integração numérica, e ferramentas para a construção de gráficos 2D e 3D.

O MATLAB é um software comercial e está disponível para Linux, Mac, Solaris e Windows.

http://www.mathworks.com/products/matlab/

Maple

O Maple é um sistema de álgebra computacional desenvolvido pela Maplesoft. Constitui um ambiente para a computação de expressões algébricas, simbólicas, permitindo o desenho de gráficos 2D ou 3D.

Possui uma interface na qual os usuários podem digitar seus cálculos em notação tradicional da matemática, da maneira como seria no papel. Possui um extenso suporte para computação numérica e computação simbólica. Possui também interface para outras linguagens como C, Fortran, Java, MATLAB e Visual Basic.

O Maple é um software comercial e está disponível para Windows, Linux, Mac e Solaris.

http://www.maplesoft.com/products/Maple/index.aspx

Mathematica

O Mathematica é um software computacional para as áreas científicas, como engenharia, matemática e outras áreas de computação técnica. Foi originalmente desenvolvido por Stephen Wolfram e é mantido pela Wolfram Research.

Dentre suas funcionalidades estão funções de matemática elementar, gráficos 2D e 3D, manipulação de dados e matrizes, resolução de sistemas de equações, cálculo, ferramentas numéricas e simbólicas, estatística, ferramentas para processamento de imagem e som, e muito mais.

Possui uma interface de entrada de expressões semelhante à notação humana, além de uma linguagem de programação própria e também ferramentas para conectar com SQL, Java, .NET, C++, FORTRAN e sistemas baseados em HTTP.

O Mathematica é um software comercial e está disponível para Windows, Mac, Linux e Solaris.

http://www.wolfram.com/products/mathematica/index.html

Scilab

O Scilab é um software para computação numérica desenvolvido pelos pesquisadores do INRIA (Institut National de Recherche en Informatique et en Automatique) e do ENPC (École Nationale des Ponts et Chaussées), e atualmente é mantido e desenvolvido pelo Consorcio Scilab.

É semelhante ao MATLAB e fornece um poderoso ambiente computacional aberto para aplicações científicas, incluindo centenas de funções matemáticas com a possibilidade de adicionar programas de várias linguagens, como Fortran, C, C++ ou Java.

Diversas ferramentas estão disponíveis no Scilab, para gráficos 2D e 3D, álgebra linear, matrizes, polinômios, sistemas lineares, funções, estatística e muito mais.

O Scilab é um software gratuito e está disponível para Linux, Windows e Mac.

http://www.scilab.org/

Maxima

O Maxima é um software livre para cálculos matemáticos semelhante ao MATLAB e ao Mathematica. É descendente do Macsyma, foi desenvolvido por William F. Schelter e agora mantido pela comunidade.

O Maxima é um sistema para computação de expressões algébricas e numéricas, incluindo integração e diferenciação, sistemas de equações lineares, polinômios, vetores e matrizes. O maxima produz resultados numéricos precisos e pode gerar gráficos de funções e dados em duas ou três dimensões. É baseado em um núcleo que utiliza a linguagem LISP.

O Maxima é um software gratuito e está disponível para Linux e Windows.

http://maxima.sourceforge.net/

Octave

O GNU Octave é um software livre para cálculos matemáticos escrito por John W. Eaton. O GNU Octave possui uma linguagem de programação de alto nível, programada inicialmente para cálculo numérico. Fornece uma linha de comando conveniente resolvendo problemas lineares e não-lineares numericamente, e executando outras tarefas numéricas usando uma linguagem que é bastante compatível com o MATLAB.

Possui ferramentas para a resolução de problemas lineares numéricos, cálculo de equações não-lineares, funções ordinárias, polinômios e integração numérica de equações diferenciais ordinárias e diferenciais-algébricas.

Pode ser expandido e adaptado através de funções definidas pelo utilizador, escritas na própria linguagem presente ou usando módulos dinamicamente carregados escritos em outras linguagens como C++, C ou Fortran.

O GNU Octave é um software gratuito e está disponível para Linux, Mac, Solaris e Windows.

http://www.gnu.org/software/octave/

segunda-feira, 10 de agosto de 2009

EXIF: Formato de Arquivo de Imagem Intercambiável

O EXIF, que é a sigla para "Exchangeable Image File Format", é um padrão para armazenar informações de intercâmbio em arquivos de imagens fotográficas, especialmente as imagens que usam a compressão JPEG ou TIFF. Este formato é parte do padrão DCF (Regra de Projeto para Sistema de Arquivo de Câmeras) desenvolvido pela JEITA (Associação Japonesa das Indústrias Eletrônicas e de Tecnologia da Informação) para encorajar a interoperabilidade entre dispositivos de imagens.

Provavelmente todas as câmeras fotográficas digitais utilizam este padrão no armazenamento de seus arquivos de fotos. Este padrão une as especificações para os arquivos JPEG ou TIFF, adicionando os caracteres de metadados em cada arquivo de foto.

Estes caracteres de metadados embutidos nos arquivos guardam informações como marca e modelo da câmera, data e hora, resolução, abertura, velocidade do obturador, exposição, velocidade ISO etc. Quase todas as configurações da câmera no momento em que a foto foi realizada são armazenadas por estes caracteres de metadados.

Estas informações são úteis no intercâmbio dos arquivos entre diversos equipamentos fotográficos, principalmente quando se realiza uma cópia impressa da fotografia por equipamentos que se conectam diretamente à câmera.

No computador estas informações podem ser vistas pelo gerenciador de arquivos, por exemplo quando clicamos para ver as propriedades do arquivo, ou através dos softwares de visualização e ou edição de imagens.

Não somente os equipamentos eletrônicos mas nós também podemos tirar proveito destas informações, como por exemplo renomear os arquivos acrescentando a data e a hora de quando as fotografias foram realizadas. Alguns softwares podem fazer isto em lote.

Se você não conhecia o EXIF, procure seus arquivos de fotos digitais e veja por si mesmo estas informações.

Estes sites abaixo fornecem as especificações para o EXIF:

http://www.exif.org/specifications.html
http://www.jeita.or.jp/cgi-bin/standard_e/list.cgi?cateid=1&subcateid=4

domingo, 9 de agosto de 2009

O centro da nossa galáxia

A Via Láctea é a galáxia onde está localizado o nosso sistema solar. É um grande aglomerado de bilhões de estrelas e outros objetos astronômicos unidos por forças gravitacionais e girando em torno de um centro de massa comum. É classificada como sendo uma galáxia espiral e o nosso sistema solar está a uma distância de aproximadamente 26 mil anos-luz do centro.

No centro da nossa galáxia existe um buraco negro supermassivo, em uma localização que é chamada de Sagittarius A*, na direção da constelação de Sagitário. Calcula-se que a massa deste imenso buraco negro central tenha aproximadamente 4,1 milhões de vezes a massa do Sol, em torno de 8,2 x 10^36 kg.

O centro da nossa galáxia é escondido da observação dos telescópios óticos por nuvens obscuras de poeira e gás. No entanto esta obscuridade torna-se transparente quando a observação é realizada pela captação de raios gama, raios X, raios infravermelhos ou ondas de rádio.

O telescópio espacial Spitzer, com câmeras de infravermelho, conseguiu uma impressionante vista que revelou as estrelas que amontoam a região do nosso centro galático, em uma amplitude de 900 anos-luz. Veja a foto abaixo:


A coordenada do nosso centro galático foi primeiramente descoberta por Harlow Shapley em 1918. Pelo sistema equatorial de coordenadas o centro está em: RA 17h45m40.04s e Dec -29°00'28.1" (J2000 epoch). Abaixo, uma imagem gerada pelo software XEphem em uma visão direcionada para o centro da nossa galáxia:


A imagem original do telescópio espacial Spitzer e seus créditos podem ser encontrados pelo endereço: http://www.nasa.gov/multimedia/imagegallery/image_feature_1439.html

sábado, 8 de agosto de 2009

Como executar programas em segundo plano

O Linux, como qualquer sistema UNIX, é um sistema operacional multitarefa, isto é, vários processamentos podem ser executados ao mesmo tempo.

Os processamentos que são controlados diretamente pela tela chamam-se processamentos em primeiro plano. Os outros processamentos que foram inicializados, mas que não se possui controle do usuário sobre eles, chamam-se processamentos em segundo plano. Podemos ter um processamento em primeiro plano, porém muitos processamentos em segundo plano podem ser executados simultaneamente.

Um processo é um programa de execução independente que tem seu próprio conjunto de recursos. No Linux, os recursos do sistema, como a memória e os discos, são gerenciados pelo kernel, que é o núcleo do sistema operacional. Tudo mais no sistema é um processo. Quando você se conecta, seu terminal é controlado pelo seu shell, que é um processo em execução. Então, o shell cria um novo processo sempre que você fornecer um comando para ser executado.

O ambiente gráfico X Window facilita a execução de diversos programas ao mesmo tempo, executando-os praticamente em primeiro plano, pois é fácil alternar entre eles com apenas um clique sobre as janelas abertas. Mas no console, o mesmo não dá para ser feito, então você terá que executar os programas em segundo plano, mantendo somente um em primeiro plano. Para isto coloca-se o símbolo & no final dos comandos, como mostrado no exemplo abaixo:

# gcc prog.c &

O prompt do shell retornará e você poderá continuar executando outros comandos enquanto o primeiro está sendo executado. Antes do prompt ser retornado, o shell informa o número do serviço que é atribuído ao comando e o PID do processo, veja um exemplo:

[1] 411

O [1] é o número do serviço e o 411 é o número de identificação do processo (PID).

Se o programa já estiver sendo executado você deverá usar o comando bg, que põe em segundo plano um processo em execução.

Para isso digite Ctrl-Z, assim o processo recebe um sinal SIGSTOP e o shell interrompe a execução do mesmo, e então use o bg para colocar o processo interrompido no modo de execução em segundo plano e o processo poderá continuar sua execução. Veja a sintaxe do comando:

bg [%id]

%id Número do serviço. É necessário ter o sinal de porcentagem antes.

Exemplo:

# bg %1

Imediatamente após o uso das teclas Ctrl-Z o shell exibe o número do serviço junto com outras informações.

Para retornar o processo ao primeiro plano, use o comando fg que transferirá o controle do terminal para o processo. Sua sintaxe é a mesma do comando bg.

Para descobrir o número do serviço atribuído ao processo use o comando jobs. O comando jobs lista os processos que estão parados ou executando em segundo plano pelo shell. Os processos são ordenados pelo número do serviço que é atribuído ao seu comando. Veja a sintaxe:

jobs [-l]

O parâmetro -l faz com que o comando jobs liste também o PID de cada processo.

Em sua saída o comando jobs retorna, além do número do serviço, o estado do processo, a linha digitada no comando e, opcionalmente, o PID.

Então, quando você for executar um comando que irá demorar para ser concluído e que não é necessário acompanhar as mensagens que possam correr pela tela, coloque a execução deste processo em segundo plano, assim você não precisa esperar o término para executar um novo comando. Isto deixará o seu terminal livre para outras tarefas.

segunda-feira, 3 de agosto de 2009

Problema de Lógica: Afirmação verdadeira ou falsa

Atenção, resposta após o problema, cuidado com os olhos!

Um homem estava em uma expedição e foi capturado por uma tribo indígena. Eles diziam saber tudo e diziam que iam matar o homem branco. No entanto lhe deram uma última chance. Ele teria que fazer uma afirmação qualquer! Se esta afirmação fosse verdadeira, ele seria enforcado. Se a afirmação fosse falsa, ele seria queimado. O que ele teria que dizer para que se livrasse da morte?





RESPOSTA





Como ele seria morto se dissesse qualquer coisa, ele teria que tentar dizer alguma coisa que não fosse nem verdadeira nem falsa. Para isto esta afirmação teria que se contradizer. O homem conseguiu isto utilizando uma afirmação que tivesse como conteúdo o seu fim se dissesse uma afirmação falsa. Neste problema ficaria o seguinte:
- Eu vou morrer queimado!
Considerando esta afirmação verdadeira, a tribo teria que matá-lo enforcado. No entanto, se ele fosse morto enforcado a afirmação seria falsa, tendo ele então que morrer queimado. Voltaria então ao ponto de partida que a afirmação se tornaria verdadeira novamente, tendo ele que morrer enforcado.