sexta-feira, 27 de julho de 2012

Conhecendo o desempenho de uma câmera digital com o Flickr

O Flickr é um site de hospedagem e compartilhamento de fotografias digitais. É semelhante a uma rede social, onde os usuários podem criar álbuns para organizar, armazenar as fotos e assim publicá-las na Web. O Flickr serve também como um fotolog.

Atualmente, existem mais de cinco bilhões de fotos armazenadas no Flickr, tiradas por fotógrafos domésticos, amadores e até profissionais, de toda parte do mundo. Toda esta base de dados possibilitou ao Flickr um nível de organização e estatística muito interessante, sobre os equipamentos fotográficos geradores das imagens.

Os arquivos de imagem, criados pela maioria das câmeras digitais, possuem incorporados à eles um conjunto de informações técnicas sobre a captura da imagem, na forma de metadados etiquetados. Estas informações seguem o padrão EXIF e são semelhantes as etiquetas ID3 dos arquivos no formato MP3.

Das informações armazenadas sob o padrão EXIF, e isto incluem-se resolução, abertura, tempo de exposição, objetiva, filtros etc. pode-se obter a marca e o modelo da câmera digital. O Flickr, obtendo toda esta informação, criou uma página em seu site para organizar e classificar, pelo equipamento, todo o acervo de fotos. Desta forma torna-se possível encontrar fotos (e vídeos) feitas de uma marca e modelo específico de câmera digital.

No site do Flickr, pelo "Localizador de câmeras" (http://www.flickr.com/cameras) temos uma lista de todas as marcas que possuem fotos armazenadas, além de um gráfico com as câmeras mais populares na comunidade do Flickr. Indo pelas marcas podemos especificar um modelo e então explorar o conteúdo do modelo determinado. As fotos ainda estão agrupadas em algumas situações como retrato, macro, noturna, paisagem e ação.

Se precisar conhecer o desempenho e a qualidade fotográfica de alguma câmera digital, basta localizar suas respectivas fotos para realizar uma avaliação. O Flickr tornou-se então um imenso mostruário das imagens geradas pelas câmeras digitais, de dezenas de marcas e centenas e mais centenas de modelos. É realmente impressionante, vale conferir.

quinta-feira, 26 de julho de 2012

Problema de Lógica: Quantas pessoas há?

Há duas pessoas na frente de uma pessoa, duas pessoas atrás de uma pessoa e uma pessoa no meio. Quantas pessoas há?





RESPOSTA





Há três pessoas. Imagine as três pessoas em fila, assim duas pessoas estão na frente da terceira, duas pessoas estão atrás da primeira e a segunda está no meio entre a primeira e a terceira pessoa.

terça-feira, 24 de julho de 2012

Pesquisa agilizada com o Glimpse

O Glimpse (GLobal IMPlicit SEarch - http://webglimpse.net/) é um indexador e pesquisador, para Unix e Linux, capaz de procurar rapidamente um termo em um conjunto grande de arquivos. Esta ferramenta suporta a maioria das opções do comando agrep, incluindo a comparação aproximada e algumas expressões regulares.

Para usar o Glimpse é preciso primeiro indexar os arquivos com o comando glimpseindex. Por exemplo, a linha de comando abaixo gera um índice, no diretório '~/glimpse', dos arquivos a partir do diretório '/evidencias':

$ glimpseindex -H ~/glimpse -o /evidencias

Em seguida, para procurar por uma palavra nos arquivos do diretório indexado, usa-se o comando exemplificado abaixo. Todas as linhas que contiverem a palavra aparecerão precedidas pelo nome do respectivo arquivo:

$ glimpse -H ~/glimpse palavra

Alternativamente, é possível fazer o Glimpse ignorar o índice e ter uma execução semelhante ao comando agrep. Para isto, basta especificar o arquivo no final da linha de comando:

$ glimpse palavra /evidencias/*

A velocidade do Glimpse depende principalmente do número e tamanho dos arquivos que contiverem a palavra pesquisada. O tamanho total dos arquivos de índice não é um fator que prejudica notadamente o desempenho.

A linha de comando do Glimpse possui diversas opções, as principais são:

-#            # é um inteiro de 1 a 8 que especifica o grau do erro
              para encontrar resultados aproximados. O padrão é zero.
-e palavra    O mesmo que um simples argumento com a palavra,
              mas útil se a palavra inicia com '-'.
-G            Exibe todo o conteúdo dos arquivos que conterem a
              palavra procurada.
-h            Não exibe o nome dos arquivos que conterem a palavra
              procurada.
-H diretório  Usa os arquivos de índice do diretório especificado.
              Quando omitido o padrão é o diretório 'home'.
-i            Pesquisa insensível a maiúsculas e minúsculas. Quando usado
              -i junto com -w a pesquisa torna-se mais rápida.
-l            Exibe somente os nomes dos arquivos que conterem a palavra
              pesquisada.
-w            Pesquisa pela palavra como uma palavra inteira, isto é,
              não retorna se for uma parte de outra palavra. Esta
              opção não funciona com expressões regulares.


Exemplos de linha de comando do Glimpse:

$ glimpseindex -H ~/glimpse -o /mnt/ntfs

$ glimpse -G -H ~/glimpse palavra

$ glimpse -Gh -H ~/glimpse palavra

$ glimpse -iw -H ~/glimpse palavra

$ glimpse -1 -H ~/glimpse palavra

$ glimpse -1 'palavra1;palavra2' Documentos/*


O Glimpse também está disponível para sites web, com a ferramenta WebGlimpse.

segunda-feira, 23 de julho de 2012

O número 100

O número 100 é um número bastante especial em nossa sociedade, principalmente por usarmos um sistema numeração decimal. É muito usado de forma positiva como: "100% de aproveitamento", "os 100 melhores", "um século de vida" e nesta semana este blog chegou a 100 mil visitas.

Em alguns casos, o número 100 é usado por ser de um tamanho adequado para a percepção humana. Nem tão restrito quanto o número 10 e nem tão disperso quanto o número 1000. Algo como uma resolução para as coisas, para separá-las em 100 partes.

Por exemplo, muito comum em nosso dia a dia é a razão denominada porcentagem. Que é um modo de expressar uma razão entre dois valores verdadeiros a partir de uma fração com denominador igual a 100. Ou seja, é obtida de uma proporção, onde a razão de base 100 é igualada a razão dos números verdadeiros. O número 100 equivale ao todo. Outro exemplo, no sistema monetário temos o número 100 sendo utilizado como divisor da unidade de moeda, assim temos os centavos, que servem para dar precisão na atribuição dos valores.

Diversas outras situações são dimensionadas e talvez mais utilizadas com base no número 100. Na ciência, citando um exemplo, o número 100 aparece na escala Celsius, de temperatura, onde 100 graus Celsius é a temperatura de ebulição da água (ao nível do mar). Também em unidades de medida, no tempo um século representa 100 anos, em medida de área existe o hectare, que são 100x100 metros quadrados, e em medida de comprimento existe o centímetro, que é um centésimo do metro.

Já no meio esportivo o número 100 tem grande representatividade. No atletismo existe a corrida de 100 metros rasos, que é considerada a principal prova do atletismo; na natação também existe as provas de 100 metros; no futebol americano, a equipe precisa avançar 100 jardas para pontuar contra a equipe adversária.

Pelos exemplos esportivos, quem chega nos 100 é um vitorioso, assim como quem chega aos 100 anos de idade, é uma benção. Como este blog, que chega a 100 mil visitas. É um número de vitória.

Uma curiosidade para o número 100 é um termo criado em 1938 para um número extremamente grande, o número 10 elevado à 100. Este número recebeu o nome "googol". 10 elevado a 100 é igual ao número 1 seguido de 100 zeros, um número muito grande. O nome do site de pesquisa mais famoso do mundo, que nós conhecemos bem, foi baseado nesta palavra, seus fundadores queriam um nome que fosse relacionado a uma grande quantidade, pois era a quantidade de páginas classificadas pelo mecanismo de busca.

Na matemática o número 100 aparece em algumas operações aritméticas muito interessantes. É possível realizar com apenas as operações de soma e subtração, aplicadas entre os dígitos da sequência de 1 à 9 (123456789), expressões que resultem no número 100. Veja em: http://dan-scientia.blogspot.com.br/2011/02/curiosidades-aritmeticas-para-o-numero.html

Há pouco mais de um ano atrás, apresentei parte do conteúdo deste artigo em um programa de televisão, que na ocasião completava a centésima edição. Na sua edição de número 100, o programa, de propósito jornalístico, fez diversas reportagens sobre lugares, entidades e pessoas com um século de vida.

Obrigado à todos pelas 100.000 visitas neste blog!

domingo, 22 de julho de 2012

Expressões regulares com o grep

O grep é um utilitário de linha de comando para busca em arquivos. O comando grep realiza uma pesquisa nos arquivos de entrada, a procura de linhas que contenham a palavra-chave informada e no resultado exibe as linhas encontradas na saída padrão.

Este utilitário possui diversas opções na linha de comando e algumas são para invocar as variantes do grep. Por padrão, o grep interpreta a palavra-chave como uma expressão regular básica (BRE). A variante egrep, invocado pela opção -E ou executado diretamente pelo comando egrep, interpreta a palavra-chave como uma expressão regular extendida (ERE).

Uma expressão regular é um padrão que descreve um conjunto de strings. É uma especificação de um modelo padrão de texto. Diversos símbolos ou caracteres especiais são compostos em união com caracteres literais e formam uma sequência, similar a uma expressão aritmética, podendo ter pequenas expressões para compor o todo. Uma expressão regular cria uma regra para ser interpretada na busca, uma condição para ser cumprida.

As expressões regulares são úteis quando não se lembra exatamente dos caracteres que compõem o texto ou na procura por uma sequência de caracteres com uma característica comum, por exemplo um número de telefone, e assim temos a ideia das variações possíveis. Também é uma maneira de procurar caracteres em posições específicas como no começo ou no fim de uma linha, ou palavra.

Observação: Apesar de semelhantes, os curingas usados ao especificar nomes de arquivos, como *.txt, relatorio.{xls,doc} e SDC500??.JPG, não são expressões regulares, os significados dos símbolos são diferentes das expressões.

Como visto, uma expressão regular é formada por caracteres com funções especiais em conjunto com caracteres normais de texto, definindo assim um padrão para a pesquisa. Cada caractere especial realiza uma operação específica.

No GNU grep não há diferença de funcionalidade entre a sintaxe básica e extendida. As descrições dos caracteres especiais apresentados a seguir são para as expressões regulares extendidas. As expressões regulares básicas possui algumas particularidades que estão descritas ao final deste artigo:

^ (circunflexo) Simboliza o início de uma linha. Se usado assim, ^palavra , serão pesquisadas linhas que iniciem com a "palavra".

$ (cifrão) Simboliza o fim de uma linha. Se usado assim, palavra$ , serão pesquisadas linhas que terminem com a "palavra".

[ ] (lista) Compara qualquer caractere único fornecido na lista. Se usado assim, n[ãa]o , serão pesquisadas linhas que contenham "não" ou "nao".

[^] (lista negada) Nega qualquer caractere único fornecido na lista. Se usado assim, palavr[^iou] , serão pesquisadas linhas que contenham "palavr?" não terminada com i, o ou u.

[-] (intervalo em lista) Compara qualquer caractere dentro do intervalo. Se usado assim, sala-[a-d] , serão pesquisadas linhas que contenham "sala-" mais um caractere entre a e d. (a ordem seguida é a ordem dos caracteres na tabela ASCII)

| (ou) Indica uma coisa ou outra. Se usado assim, (pato|ganso) , serão pesquisadas linhas que contenham "pato" ou "ganso".

. (ponto) Simboliza qualquer caractere numa certa posição. Se usado assim, palavra. , serão pesquisadas linhas que contenham "palavra" mais um caractere, por exemplo palavra1,palavra2,palavraa etc.

* (tanto faz) Indica que tanto faz a quantidade do caractere anterior. Se usado assim, palavras* , serão pesquisadas linhas que contenham "palavra", "palavras", "palavrass", "palavrasss" etc.

.* (curinga) Simboliza qualquer caractere em qualquer quantidade. Se usado assim, ^nome.*sobrenome$ , serão pesquisadas linhas que iniciem com "nome" e terminem com "sobrenome", com qualquer coisa no meio.

+ (tem que ter) Indica que deverá ter o caractere anterior em qualquer quantidade. Se usado assim, palavras+ , serão pesquisadas linhas que contenham "palavras", "palavrass", "palavrasss" etc.

? (opcional) Indica que o caractere anterior é opcional. Se usado assim, palavras? , serão pesquisadas linhas que contenham "palavras" ou "palavra".

{ } (chaves) Indica o número de repetições do caractere anterior. Se usado assim, p.{5} , serão pesquisadas linhas que contenham palavras iniciadas com "p" e mais cinco caracteres quaisquer. Ou pode indicar um intervalo. Se usado assim, p.{5,7} , indica "p" mais cinco a sete caracteres. Se usado assim, p.{5,} , indica "p" mais cinco ou mais caracteres quaisquer.

\b (borda) Indica uma borda de palavra. Marca os limites de uma palavra, ou seja, onde ela começa e/ou termina. Se usado assim, \bpala , serão pesquisadas linhas que contenham palavras iniciadas com "pala". Se usado assim, vra\b , serão pesquisadas linhas que contenham palavras terminadas com "vra".

\B (fora da borda) Indica que a palavra-chave não está nas bordas de uma palavra. Se usado assim, \Bala , serão pesquisadas linhas que contenham palavras com o padrão "ala" em algum lugar fora do início ou fim, por exemplo "palavra".


Exemplos de uso de expressões regulares no grep:

grep ^usuario /etc/passwd

grep bash$ /etc/passwd

grep ^.*5[0-9][0-9] /etc/group

grep '\[' /etc/*
grep '[[]' /etc/*

egrep \(root\|ftp\) /etc/group
egrep '(root|ftp)' /etc/group
grep -E '(root|ftp)' /etc/group
grep '\(root\|ftp\)' /etc/group
grep \\\(root\\\|ftp\\\) /etc/group

grep -E '(((1[0-9]|[1-9]?)[0-9]|2([0-4][0-9]|5[0-5]))\.){3}((1[0-9]|[1-9]?)[0-9]|2([0-4][0-9]|5[0-5]))' /var/log/secure

grep -E '([0-9]{4}.?){3}[0-9]{4}' arquivo_com_número_de_cartão_de_crédito

grep -E '([0-9]{3}.?){3}[0-9]{2}' arquivo_com_número_de_CPF

grep -E '[0-9]{2}/[0-9]{2}/[0-9]{4}' arquivo_com_data


Considerações a respeito das expressões regulares:

Nas expressões regulares básicas os caracteres especiais ?, +, {, |, (, e ) perdem seus significados especiais, no lugar use as versões com barra invertida \?, \+, \{, \|, \(, e \). A opção -E do grep ou o uso do comando egrep não necessita disto.

Se precisar utilizar um caractere especial como um caractere literal, utilize \ (barra invertida) para anular (escape) o efeito do caractere especial ou proteja-o em uma lista [ ].

Alguns caracteres especiais usados nas expressões regulares precisam estar protegidos da interpretação do shell. Para protegê-los utiliza-se o caractere \ (barra invertida) ou proteja tudo com ' (apóstrofos).


A expressão regular é um recurso poderoso e é suportada por muitos comandos do Linux, incluindo find, sed e awk. Também é usada em editores de texto e em linguagens de programação para procura e substituição de texto.

domingo, 8 de julho de 2012

Atualizando as principais distros Linux

Existem dezenas de distribuições Linux, entretanto a grande maioria são baseadas nas quatro principais, Slackware, Debian, Suse e Red Hat, herdando as principais características e funcionalidades. Demonstrar o modo de operação destas quatro distros já é suficiente para abranger quase todas.

Uma das grandes características das distribuições Linux está na funcionalidade de atualização de todo o sistema. Independente do formato do pacote adotado, seja .rpm, .deb ou .txz, as distros dispõem de ferramentas que gerenciam a base de pacotes instalada. Cada distribuição, dentre as quatro base, terão ferramentas distintas para esta operação.

Apenas pela linha de comando, é possível executar esta atualização geral do sistema, substituindo os pacotes antigos por versões novas. A seguir veremos as particularidades de cada uma delas e os respectivos comandos básicos:

Red Hat, Fedora, CentOS:

Estas distribuições utilizam a ferramenta YUM no processo e usam o formato RPM nos pacotes. As configurações ficam no arquivo "/etc/yum.conf" e no diretório "/etc/yum.repos.d/". Para atualizar os pacotes instalados, execute o comando a seguir:

# yum update


Debian, Ubuntu:

Estas duas distros e suas descendentes, utilizam as ferramentas apt-get ou aptitude, em comandos semelhantes, e usam o formato DEB nos pacotes. As configurações de repositórios ficam no arquivo "/etc/apt/sources.list". Para atualizar os pacotes instalados, execute os comandos:

# apt-get update
# apt-get upgrade


openSUSE:

O openSUSE utiliza na linha de comando a ferramenta Zypper e usa o formato RPM nos pacotes. As configurações ficam no arquivo "/etc/zypp/zypper.conf". Para atualizar os pacotes instalados, execute os comandos:

# zypper list-updates
# zypper update


Slackware:

O Slackware utiliza na linha de comando a ferramenta slackpkg e usa o formato TXZ nos pacotes. As configurações de repositórios ficam no arquivo "/etc/slackpkg/mirrors". Para atualizar os pacotes instalados, execute os comandos:

# slackpkg update
# slackpkg check-updates
# slackpkg install-new
# slackpkg upgrade-all


O procedimento de atualização envolve primeiro atualizar a lista dos pacotes fornecidos pelos repositórios, para o sistema saber o que há de novo, e então atualizar os pacotes instalados por novos pacotes. Os comandos foram apresentados em ordem. A ferramenta YUM faz isto em apenas um comando, nas outras são necessários dois ou mais comandos.

Os comandos apresentados neste artigo são para uma atualização dos pacotes dentro da mesma versão da distribuição. É possível também atualizar os pacotes de modo que atualize a versão da distribuição, por exemplo de Debian 5 para Debian 6. Os comandos para este procedimento não estão demonstrados neste artigo.

Apenas o superusuário (root) tem a permissão para executar estes comandos, um usuário comum não é capaz de atualizar o sistema.

sábado, 7 de julho de 2012

A fórmula no algoritmo do Google

A história do Google começou em 1996 quando Larry Page e Sergey Brin, ambos estudantes de Ciência da Computação na Universidade Stanford, deram início ao desenvolvimento de um mecanismo de busca para a Web. No ano seguinte este mecanismo recebeu o nome Google.

Ainda em Stanford, Larry e Sergey desenvolveram um método para graduar as ligações de um banco de dados de documentos, a World Wide Web ou qualquer outro banco de dados de hipertexto. Este método foi patenteado pela Universidade Stanford e posteriormente nomeado pelo Google como PageRank.

O sistema PageRank é usado pelo motor de busca Google para ajudar a determinar a relevância ou importância de uma página. O PageRank é a característica mais importante do algoritmo do Google.

O PageRank assina uma posição ou nota a cada resultado de busca. Quanto maior a nota, mais alta sua posição na lista de resultados. As notas são determinadas, em parte, pelo número de outras páginas de Web com links para a página visada. Nem todos os votos tem o mesmo valor. Os votos de páginas de alta popularidade na Web contam mais do que os votos de sites de baixa popularidade. Quanto mais links uma página de Web oferece, mais diluído seu poder de votação.

Esta estrutura de links da web usada para calcular a classificação de cada página fornece uma ajuda importante para produzir resultados precisos. Em um documento, apresentando o protótipo do mecanismo de busca Google, Sergey Brin e Larry Page descreveram o algoritmo do PageRank (PR). O PageRank é um algoritmo recursivo, pois a mudança do PR de uma página afeta os PRs das outras páginas. Uma mudança no PR de outra página também mudará o PR da página consequente e assim sucessivamente até que, inclusive, pode afetar o PR da página inicial.

Uma página A possui as páginas T1...Tn que apontam para ela. O parâmetro d é um fator de amortecimento que pode atribuir valor entre 0 e 1. Usualmente definido d para 0,85. E C(A) é definido como o número de links saindo da página A. O PageRank da página A é dado na fórmula PR(A) = (1-d) + d (PR(T1)/C(T1) + ... + PR(Tn)/C(Tn)).



Note que os PageRanks formam uma distribuição de probabilidade sobre as páginas web, então a soma de todos os PageRanks das páginas Web será um.

Um PageRank ou PR(A) pode ser calculado usando um simples algoritmo iterativo. Um PageRank para 26 milhões de páginas web pode ser calculado em poucas horas em uma workstation de tamanho médio.

Saiba mais em:

The Anatomy of a Large-Scale Hypertextual Web Search Engine (http://infolab.stanford.edu/~backrub/google.html)

United States Patent 6,285,999 (http://patft.uspto.gov/netacgi/nph-Parser?Sect1=PTO1&Sect2=HITOFF&d=PALL&p=1&u=%2Fnetahtml%2FPTO%2Fsrchnum.htm&r=1&f=G&l=50&s1=6285999.PN.&OS=PN/6285999&RS=PN/6285999)