Mostrando postagens com marcador busca. Mostrar todas as postagens
Mostrando postagens com marcador busca. Mostrar todas as postagens

terça-feira, 29 de janeiro de 2013

Wolfram Alpha

Em filmes de ficção científica já vimos muitas cenas onde um personagem faz uma pergunta a um computador super poderoso, que detém todo o conhecimento. Nos filmes mais antigos isto era nada mais que ficção, mas hoje em dia, este tipo de consulta está se tornando realidade.

Desde 2009, existe uma ferramenta computacional desenvolvida pela Wolfram Research, a mesma que desenvolve o Mathematica, chamada Wolfram Alpha. O Wolfram Alpha é um motor de busca, um serviço online, que responde a consultas e é capaz de retornar resultados de cálculos matemáticos e informações a respeito do item pesquisado. O Wolfram Alpha é baseado na plataforma computacional Mathematica, pela sua linguagem simbólica generalizada e seus algoritmos que proporcionam as bases computacionais de qualquer área, e baseado nos algoritmos de "A New Kind of Science" (NKS), um novo ramo que estuda o universo computacional. A base de dados oferecida pelo Wolfram Alpha cobre uma imensa gama de áreas do conhecimento, pra não dizer todas, ou quase.

O Wolfram Alpha funciona em diversas plataformas, mas o acesso mais fácil para o usuário comum é pelo website (http://www.wolframalpha.com/) ou pelo aplicativo para dispositivos móveis, incluindo smartphones com Android (https://play.google.com/store/apps/details?id=com.wolfram.android.alpha). Em sua interface web somos recebidos com a frase "Entre com o que você deseja calcular ou saber a respeito:" e um campo para digitar o que quiser, assim, bem simples.


A página de exemplos (http://www.wolframalpha.com/examples/) ilustra bem todo o potencial da ferramenta, é impressionante, vale a pena ver cada exemplo para conhecer a imensa capacidade. Não é uma simples pesquisa na web, são computações dinâmicas baseadas em uma vasta coleção de dados, algoritmos e métodos. Entre com um cálculo matemático, a ferramenta retorna com a resposta, o gráfico, o passo a passo da solução etc. Entre com o nome de um objeto, a ferramenta retorna suas características, suas especificações etc. É uma enciclopédia que não para de crescer. Experimente as seguintes expressões na pesquisa: "where am i?" e "what is the weather here?", preferencialmente a partir de um smartphone, os resultados são bem legais. E seu uso vai além, por exemplo, a Siri, assistente da Apple, utiliza o motor de busca do Wolfram Alpha para responder determinadas requisições dos usuários.


O Wolfram Alpha quer tornar todo o conhecimento sistemático, computável de forma imediata e acessível para todos. Hoje em dia isto é possível, pois os computadores já são poderosos o suficiente e temos a Internet para propagar a informação quase que instantaneamente. O único obstáculo é uma estrutura de algoritmos capazes de computar tudo, mas parece que este entrave já está sendo superado. Haverá um tempo onde reassistiremos Star Trek e vamos achar normal, nada futurista.

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.

quinta-feira, 8 de outubro de 2009

Pesquisa binária em vetor ordenado

A pesquisa ou busca binária é um algoritmo de pesquisa em vetores bastante eficiente. Aplicando somente quando o vetor está ordenado, o algoritmo realiza sucessivas divisões no espaço de pesquisa comparando o elemento procurado com o elemento do meio do vetor.

Se o elemento do meio do vetor for igual ao elemento procurado, a pesquisa termina com sucesso retornando a posição do elemento. Caso contrário, se o elemento do meio vier antes do elemento procurado, então repete-se a pesquisa para a metade posterior ao meio do vetor. E se o elemento do meio vier depois do elemento procurado, repete-se a pesquisa para a metade anterior ao meio do vetor.

No exemplo de código a seguir, em linguagem C, é apresentado duas versões do algoritmo, uma função com a versão iterativa e outra função com a versão recursiva. Quando o elemento procurado não for encontrado é retornado o valor -1.

A variável esq armazena a primeira posição mais à esquerda, o início do vetor do espaço de pesquisa e, do mesmo modo, a variável dir armazena a última posição mais à direita, o fim do vetor do espaço de pesquisa. Acompanhe o código:

#include <stdio.h>
#include <stdlib.h>

int pesqbit(int *vetor, int tamanho, int valor) { // versão iterativa.

int esq = 0;
int dir = tamanho - 1;
int meio;

while (esq <= dir) {

meio = (esq + dir)/2;

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

}

int pesqbre(int *vetor, int esq, int dir, int valor) { // versão recursiva.

int meio = (esq + dir)/2;

if (vetor[meio] == valor) {
return meio;
} else if ((vetor[meio] < valor) && (esq < dir)) {
return pesqbre(vetor, meio+1, dir, valor);
} else if ((vetor[meio] > valor) && (esq < meio)) {
return pesqbre(vetor, esq, meio-1, valor);
} else {
return -1;
}

}

int main() { // exemplo de uso com as chamadas para as funções.

int valor;
int vetor[] = {1,2,3,4,5,6,7,8,9,10,11,12};

printf("Digite um numero: ");
scanf("%d", &valor);

printf("(Versao Iterativa) A posicao e: %d\n", pesqbit(vetor, sizeof vetor / sizeof (int), valor));
printf("(Versao Recursiva) A posicao e: %d\n\n", pesqbre(vetor, 0, (sizeof vetor / sizeof (int))-1, valor));

}