domingo, 29 de junho de 2014

Sintaxe de Algoritmos

Para facilitar o entendimento dos algoritmos e, conseqüentemente, sua tradução para as diversas linguagens de programação existentes atualmente, adotaremos uma sintaxe de descrição padrão.
Nossa sintaxe será baseada na linguagem Pascal.
Hierarquias - As hierarquias serão denotadas pelas identações entre as linhas. Ou seja, terão a mesma ordem hierárquica todas as instruções que estiverem a uma mesma distância da margem esquerda da tela.
  • Variáveis - Não serão declaradas variáveis ou mesmo tipos de variáveis. Todas as variáveis utilizadas aparecerão ao longo do código e serão representadas por conjuntos de letras e números.
Ponteiros receberão uma representação diferenciada, para destacá-los das variáveis comuns:
^pt - variável do tipo ponteiro (armazena um endereço de memória).
[^pt] - acesso ao conteúdo no endereço que ^pt armazena.
$var - endereço da variável var.
  • Operadores
  • matemáticos
OPERAÇÃO         OPERADOR

adição           +
subtração        -
multiplicação    *
divisão          /
módulo           MOD
quociente        DIV
  • lógicos
OPERAÇÃO         OPERADOR

e (and)          E
ou (or)          OU
não (not)        ~
  • relacionais
OPERAÇÃO         OPERADOR

maior            >
maior ou igual   >=
menor            <
menor ou igual   <=
igual            =
diferente        ~=
  • Condicionais (ou blocos de seleção) - As possíveis formas de uma estrutura condicional serão:
SE (...) ENTÃO
   (...)
SENÃO SE (...) ENTÃO
   (...)
SENÃO
   (...)
SELECIONE (...) DENTRE
   [valores]:
      (...)
      SAIA
  • Laços - A estrutura dos laços de repetição serão:
ENQUANTO (...) FAÇA
   (...)
PARA var <- 1="" fa="" pre="">
FAÇA
   (...)
ATÉ (...)
  • Valores de retorno
Sempre que um algoritmo especificar um campo SAÍDA em sua definição (ver a seguir), em seu corpo deverá ocorrer ao menos uma instrução RETORNA. Os algoritmos definirão os valores a serem retornados como a seguir:
RETORNE a
Estrutura dos Algoritmos

Sempre que um novo algoritmo seguir, será da seguinte forma:
ALGORITMO: NomeAlgoritmo(i, nome, ^pt)
ENTRADA: inteiro i, frase nome
[SAÍDA: quantidade de letras de nome]
[REQUISITOS: nome deve iniciar por caractere alfabético]
--------------------------------------------------------
    (instruções)
Os campos entre colchetes são utilizados somente quando necessário.

sábado, 28 de junho de 2014

Lista Ordenada.

Continuando com minha promessa, vamos falar sobre listas ordenadas, mais uma vez adotando o pascal,
bom já definimos o que é uma lista simplesmente encadeada, porém um array possui um índice ou seja uma posição, então com o intuído de tornar uma lista familiar a estrutura de um array, o registro passa a adotar um campo chamado índice ou posição ou chave onde esse vai determinar a posição do registro tornado mais intuitiva a busca ou posição de uma informação  dentro de uma estrutura de dados.

Lista Ordenada

Definição: É uma lista que mantém os seus elementos sempre ordenados por algum critério.
Deve ser usada quando é necessário acessar os elementos da lista de forma ordenada. Quando a ordem não for importante, deve-se considerar o uso de outro tipo de lista pois as operações de inserção e remoção são mais caras (exigem mais processamento)  nas listas ordenadas.
A forma mais comum de se implementar uma lista ordenada é usando uma lista encadeada, onde o primeiro nó é menor que o segundo e assim por diante. Graficamente teríamos:

Para
Para ver uma implementação de uma lista Ordenada, abra a unit LstOrd e para um programa que demonstra como usá-la, veja DLstOrd.
O procedimento inicializar faz com que a cabeça da lista aponte para nil, indicando que não há elementos na lista.
O procedimento apagar e as funções vazia e tamanho são iguais à da lista encadeada, recebendo apenas um parâmetro com tipo diferente.
A função inserir coloca o item passado na posição correta da lista, ou seja, mantendo a ordem da mesma. A lista não deve conter uma chave igual à do item passado. Se a chave do item passado for menor do que a do primeiro da lista, será inserido no início e tornar-se-á a cabeça da lista (situação 1). Caso contrário, será inserido no meio (situação 3) ou no final (situação 2) da lista, dependendo do valor de sua chave e dos elementos contidos na lista (situação 2).
Situação 1: Inserindo um valor no início da lista:


Situação 2: Inserindo um valor no final da lista:


Situação 3: Inserindo um valor no meio da lista:


A função remover encontra um item na lista com a chave passada, libera a memória alocada pelo item e ajusta apontadores. No caso da remoção, encontramos 2 situações: remoção do elemento da cabeça ou que não está na cabeça.
Situação 1: Removendo um item da cabeça da lista:


Situação 2: Removendo um item que não está na cabeça da lista:


fonte: http://albertocn.sytes.net/2010-2/ed1/aulas/listas_lineares.htm

sexta-feira, 27 de junho de 2014

Desenvolva uma aplicação com Big Data.

Olá pessoal, retomando o assunto Big data, então já foi falado de modo mais explicativo o uso, mas não de como desenvolver aplicações usando Big Data, verificando o site da IBM que naturalmente é líder quando falamos em grandes servidores, existe um breve tutorial para que nós caros mortais possamos desenvolver aplicações voltadas a esses assuntos, lembrando que Big Data não é restrito somente a dados e informações
mas chega ao foco de multimídia como o You tube, redes multimídia é um assunto um pouco longo, talvez
pincele um poco sobre esse tema antecipando a disciplina de Redes II, porem o foco não é redes e sim Big Data, então segue o link que contem um tutorial que nos ajuda a criar aplicações de Big data usando o eclipse. http://www.ibm.com/developerworks/br/data/library/techarticle/dm-1209bigdatabiginsights/
Fonte: http://www.ibm.com/us/en/

quarta-feira, 25 de junho de 2014

Lista Encadeada.

Como prometido vamos falar sobre lista encadeada, a principio vamos adotar o pascal, falando um pouco
sobre lista simplesmente encadeada, pense que um array é uma estrutura de dados que é tipada e possui o tamanho limitado ao que definimos no corpo do programa é já era, mas e se for necessário um vetor maior no tempo de execução e claro se for necessário poupar memoria ?, daí entra nossa lista simplesmente encadeada, essa se trata de uma estrutura de dados similar a um vetor a diferença se dá no conceito de alocação dinâmica de cada registro, tornado um vetor de tamanho indeterminado ou seja se desejo um elemento o minha lista terá um elemento mas se necessário n elementos a lista terá n elementos o quanto a memoria poder suportar.

Lista Encadeada

Definição: Uma lista encadeada é uma coleção de registros em que cada registro tem um campo que indica a localização do registro seguinte na lista.
Assim, a ordenação é fornecida explicitamente por esse campo. Esquematicamente podemos representar uma lista ligada da seguinte forma:

Onde o registro que representa cada componente da lista possui um campo que aponta para o próximo registro numa certa seqüência de ordenação.
Cabeça: Primeiro registro (elemento) da lista.
Cauda: Último elemento da lista. Para indicar que não ha elementos após a cauda, atribui-se nil ao apontador para o próximo, já que não existe um próximo.
A principal vantagem das listas encadeadas sobre as listas seqüenciais é que as primeiras podem aumentar e reduzir de tamanho dinamicamente, podendo assim ser usadas em diversas situações sem comprometer o uso de memória.
A principal desvantagem das listas encadeadas é a necessidade de armazenamento adicional para guardar os apontadores.
Para ver uma implementação de uma lista Encadeada, abra a unit LstEnc e para um programa que demonstra como usá-la, veja DLstEnc.

Inserção na lista encadeada

Inicialmente a cabeça da lista aponta para nil, indicando que a mesma está vazia (1). Após a inserção do um Item 1 na lista, a cabeça aponta para ele, e o apontador para o próximo Item contido no Item 1 aponta para nil, já que após ele não há outros itens (2). Caso um outro elemento (Item 2) seja inserido, ele passa a ser a cabeça da lista e seu apontador para o próximo elemento da lista aponta para a antiga cabeça da lista (Item 1), como pode ser verificado em (3).


Remoção na lista encadeada

Quando o item a ser removido encontra-se na cabeça da lista, executamos os seguintes passos:
1) Navegamos na lista até encontrar o item a ser removido e guardamos o apontador para o próximo item (segundo) da lista.
2) Fazemos com que o apontador para a cabeça passe a apontar para o item seguinte à cabeça da lista, através do apontador obtido no passo 1.
3) Já que a cabeça já foi ajustada, executamos o dispose no item que localizava-se na cabeça da lista, liberando a memória referente ao Item removido da lista.
4) A lista passa a ter um elemento a menos e a variável dinâmica que continha o elemento apontado pela cabeça da lista foi desalocado da memória.

Quando o item a ser removido não se encontra na cabeça da lista, é necessário atualizar o apontador do item anterior. Sendo assim, usamos um apontador (PAtual) para procurar o Item a ser removido e outro (PAnterior) para guardar o Item anterior na lista encadeada. Desta forma, ao encontrar o Item (1), temos um apontador para o item anterior a ele (PAnterior) e para o próprio item (PAtual), como mostra (2). De posse destes apontadores, podemos ajustar o apontador para o próximo do item apontador por PAnterior para o endereço apontado pelo campo próximo do item apontado por PAtual. Em seguida, usamos o dispose para desalocar a variável dinâmica que guarda o item removido (3). Ao final, temos uma lista encadeada com um item a menos e com todos os apontadores ajustados.


 Fonte:http://albertocn.sytes.net/2010-2/ed1/aulas/listas_lineares.htm

sábado, 21 de junho de 2014

Privacidade em tempo de Big Data.

Não é uma novidade mas, todos devem saber que o Facebook é a maior rede social do planeta, porem como o face ganha tanto dinheiro? isso é feito por meio do uso de Big Data, ou seja usam os perfis do site para comercializar quem esta mais propicio a comprar um HD 1Tb, então é uma grande parceria de https://www.ibm.com/developerworks/community/blogs/ctaurion/entry/privacidade_em_tempos_de_big_data?lang=en, agradeço a tenção, é uma leitura bacana vale a pena.
marketing, mas não só isso, analisar um grande volume da dados não é somente vantajoso ao mercado de vendas e  sim a segurança nacional, um ponto muito importante, o que diria nosso queridos espiões dos  USA, basta ser um terrorista em potencial que sua conta é simplesmente observadas por olhos anônimos, então onde fica a sua a minha a nossa privacidade ?, segue uma reportagem bacana sobre isso no link :

fonte: https://www.ibm.com/developerworks/community/blogs/ctaurion/entry/privacidade_em_tempos_de_big_data?lang=en

quarta-feira, 18 de junho de 2014

Alocação dinâmica de memoria.

No inicio da graduação quando falamos de memoria pensamos em algo sem limites e que no qual nosso professor faz o comentário não se preocupa com a memoria agora, mas quando passamos a viver uma vida
cheia de códigos confusos e naturalmente grande volume de acesso a informações ou podemos traduzir em big data, pensamos que servidores possuem memoria limitada e nem sempre programamos do modo mais adequado, então voltamos a tão prometida estrutura de dados que vai determinar a eficiência do sistema, então para evitar a criação de um novo SIGAA prestemos atenção no modo com o qual programamos e se realmente aquela é a melhor solução, agora vou passar uma breve noção de alocação dinâmica de memoria em pascal, essa é uma noção importante pois quando fazemos a + b em PI as coisa são muito simples, mas e quando fazemos n somas em sistema paralelo onde se faz necessário o armazenamento de informações? será usar um array uma solução ou problema?

Alocação e Desalocação de Variáveis Dinâmicas

Há uma função chamada new que dado um apontador cria uma variável dinâmica do tipo do apontador e faz com que o apontador tipado passado aponte para a variável criada.
new (<apontador-tipado>)
Para liberar a memória alocada pela função new, usa-se o procedimento dispose.
dispose (<apontador-tipado>)
Exemplo 5: Usando new e dispose para trabalhar com variáveis dinâmicas.type
   TItem = record
      Nome : String[20];
      Preco : real
   end;
var
   PItem, PAnterior : ^TItem;
begin
   New(PItem);
   PItem^.Nome := 'Livro de ED1';
   PItem^.Preco := 30.0;
   PAnterior := PItem;

   New(PItem);
   PItem^.Nome := 'Outro livro';
   PItem^.Preco := 10.0;

   writeln(PAnterior^.Nome);
   writeln(PAnterior^.Preco);

   writeln(PItem^.Nome);
   writeln(PItem^.Preco);

   Dispose(PAnterior);
   Dispose(PItem);

   PItem := nil;
   PAnterior := nil
end.



Exemplo 6: Usando variáveis dinâmicas para ler e guardar na memória uma lista de itens.type
   PItem = ^TItem;
   TItem = record
      Nome : string[20];
      Preco : real;
      Proximo : PItem
   end;
var
   Head : PItem;
   PNew : PItem;
   Resp : char;
begin
   Head := nil;

   repeat
      New(PNew);
      writeln('Digite o nome e o preco do Item:');
      readln(PNew^.Nome, PNew^.Preco);
      PNew^.Proximo := Head;
      Head := PNew;
      write('Outro Item (S/N)?');
      readln(Resp);
   until UpCase(Resp) = 'N';
end.
 Bom pessoal isso é pouco quanto ao conhecimento que cada um pode buscar, quem sabe não ensino listas,filas e pilhas nas próximas postagens abraço.
fontes :http://albertocn.sytes.net/2010-2/ed1/aulas/apontadores.htm
http://vidadeprogramador.com.br/2014/01/23/pouca-memoria/

quarta-feira, 11 de junho de 2014

Big Data e Biometria.


Podemos pensar que a sociedade sem um governo tende ao caos, um dos  grandes problema das nossas organizações não organizadas é a segurança, na idade média bastava uma pequena abertura em uma grande porta de madeira para reconhecer que o visitante não era um invasor, mas a idade media passou e as
populações cresceram, o reconhecimento de padrões é classificado como o que nos distingue dos nossos amigos primatas, então o grande volume de faces ao adentras nos castelos modernos(shoppings, estádios, arenas e etc..)  não mais poderão ser reconhecidos pelos olhos humanos, pois possuímos essa capacidade porem somos limitados em armazenar tantos dados, então finalmente entro no assunto Big Data, hoje existe uma grande tendencia para que as cidades modernas tenham seu próprio " Big brother", porem existem milhões de pessoas adentrando cada ambiente, uma das soluções criadas pela humanidade é o reconhecimento biométrico, podendo ele ser feito de diversos modos, detre eles o reconhecimento de face que já é amplamente usado em câmeras digitais,o CPF e RG possuem a capacidade de demonstrar que o documento é verdadeiro, porem não pode demonstrar se realmente é você de verdade, será esse o fim das senhas?
Segue uma matéria bacana sobre biometria e Big Data.

Biometria facial é arma para combater fraudes no varejo brasileiro

O cpf existe, o nome confere, o documento é real, mas a foto não é "a cara do dono". Só em 2012, empresas brasileiras sofreram 2,14 milhões de fraudes por roubo de identidade. O Certiface quer acabar com o problema

A cena é mais comum do que você imagina. Dona Rosângela, uma senhora simpática, está no setor de crediário da loja para parcelar suas compras de eletrodomésticos. Seu CPF e nome conferem na base de dados da Receita Federal e seu score de crédito está perfeito.

Só tem um problema: Dona Rosângela comprou em outra loja, com a mesma carinha simpática, mas ela se chamava Berenice. Seu nome e cpf também estavam em ordem na Receita Federal e conferiam com o documento apresentado. Dona Berenice nunca pagou o crediário. E DonaRosângela também não vai pagar o novo crediário.
Onde está o erro? Acertou quem disse que era a foto. "O problema não é o CPF, mas o rosto de quem o está portando", explica Plauto Diniz, diretor daNeti, empresa paulista especializada em soluçoes de biometria facial de missão crítica para área financeira.
"Os criminosos hoje já produzem documentos com papéis originais e usam CPFs, RGs e nomes verdadeiros sem problema de negativação de crédito. Mas substituem a foto do dono pela foto do fraudador", diz o executivo.
Um dos produtos da Neti é o Certiface, sistema de biometria facial para detecção de fraudes em tempo real e usando recursos de cloud computing. O Certiface está ativo em 180 lojas de uma rede de varejo brasileira há dois anos, mapeia cerca de 20 mil rostos por mês, tem um banco de dados na nuvem com mais de 300 mil rostos e já digitalizou mais de 800 mil documentos, segundo Diniz
O segredo do Certiface é usar uma webcam comum na hora de fazer a aprovação do crédito. A atendente pede ao cliente os documentos e tira uma foto para acompanhar o cadastro, enviando a informação em tempo real para o banco de dados na nuvem.
A foto, nome e número de CPF associados a ela são comparados com a base de dados do Certiface. Se houver outra foto com um percentual alto de semelhança associada a um número diferente de CPF, ou se o mesmo número de CPF estiver associado a um rosto completamente diferente, um alerta é enviado imediatamente por SMS para o gerente da área de crédito e na tela a atendente vê as duas fotos para decidir o que fazer.
Usualmente, explica Diniz, a atendente pede ao cliente que apresente um outro documento ou comprovação de identidade. "Se ele realmente for o dono da identidade, certamente vai ter como comprovar. O fraudador, diante do pedido, disfarça, diz que esqueceu ou que vai ao banheiro e nunca mais volta", garante.
Diniz explica que o sistema utiliza os padrões biométricos mundiais (normas ANSI/INCITS M1 e comitês técnicos ISO/IEC SC 37) para leitura, gravação e validação de dados das fotos. "Ao tirar a foto, o sistema orienta a atendente a posicionar a webcam de acordo com os padrões", diz o executivo.
A Neti, que foi criada em Bebedouro, interior de São Paulo, está em ritmo de startup e recentemente transferiu sua sede para Sorocaba (SP) após receber um aporte de investimentos para ampliar suas soluções de biometria.
Diniz explica que a empresa escolheu se concentrar na biometria facial porque mesmo a impressão digital não é um identificador presente em 100% da população. "Entre 5% a 10% das pessoas no mundo não tem impressão digital, muitas vezes porque sua atividade profissional utiliza produtos que são abrasivos e gastam a pele dos dedos", diz.
Em 2012, segundo a Serasa Experian, o Brasil teve um total de 2,14 milhões de fraudes. Para as empresas, o principal problema não é apenas o prejuízo do crediário não pago. "Para cada real perdido na fraude as empresas gastam mais 1,7 real com custas legais e processuais", explica Diniz. O Certiface reduz a quantidade de processos, protege o verdadeiro dono dos documentos que teve sua identidade roubada e diminui as fraudes.
A Neti é parceira de negócios da Samsung e está lançando agora a versão mobile do Certiface, portada para Android e também para iOS. Como tudo funciona na nuvem e os smartphones têm câmeras poderosas, a aposta da empresa é oferecer o produto para outras aplicações de segurança ou para quiosques em shoppings, por exemplo.
Ah, para sua informação, a história da Dona Rosângela é verdadeira, mas na vida real ela não tinha apenas dois CPFs associados ao seu rosto, mas sim quatro diferentes sets de documentos mapeados pelo Certiface. E não conseguiu fazer a compra!
Em breve o sonho de Matrix será mais realidade do que possamos imaginar em anos cujo só nosso imaginação poderia compor tal realidade.
Fonte :http://computerworld.com.br/tecnologia/2014/02/05/biometria-facial-e-arma-para-combater-fraudes-no-varejo-brasileiro/ 

sexta-feira, 6 de junho de 2014

Recursividade





Recursão é um método de programação no qual uma função pode chamar a si mesma. O termo é usado de maneira mais geral para descrever o processo de repetição de um objeto de um jeito similar ao que já fora mostrado. Muitos problemas em computação tem a propriedade de que cada instância sua contém uma instância menor do mesmo problema.
A chamada à função proveniente de um meio externo a ela é denominada chamada externa e cada uma das chamadas internas a si mesma é denominada chamada recursiva.
Um método comum de simplificação é dividir o problema em subproblemas do mesmo tipo. Como técnica de programação, este método é conhecido como dividir e conquistar e é a chave para a construção de muitos algoritmos importantes, bem como uma parte fundamental da programação dinâmica.
A recursão na programação é bem exemplificada quando uma função é definida em termos de si mesma. Um exemplo da aplicação da recursão são os parsers (analisadores gramaticais) para linguagens de programação. Uma grande vantagem da recursão é que um conjunto infinito de sentenças possíveis, designs ou outros dados podem ser definidos, analisados ou produzidos por um programa de computador finito.
Relações de recorrência são equações que definem uma ou mais seqüências recursivamente. Alguns tipos específicos de relações de recorrência podem ser “resolvidos” para que se obtenha uma definição não-recursiva.
Um exemplo clássico de recursão é a definição do cálculo do fatorial de um número, dada aqui no algoritmo a seguir:

1:  ALGORITMO: Fatorial(n)   
2:  ENTRADA: inteiro n  
3:  SAÍDA: fatorial de n  
4:  REQUISITOS: n >= 0  
5:  SE n <= 1  
6:    RETORNE 1  
7:  SENÃO  
8:    RETORNE n * Fatorial(n-1)  

A função chama a si mesma recursivamente em uma versão menor da entrada (n - 1) e multiplica o resultado da chamada por n, até que alcance o caso base, de modo análogo à definição matemática de fatorial.
Como pode-se notar pela primeira condição, todo processo recursivo necessita de uma condição de parada para evitar um loop infinito. Neste caso, quando a função fatorial atinge o valor menor ou igual a 1 ele passa a retornar o valor de volta para a função.
No entanto, a recursão não é sempre a melhor opção. Como pode-se ver na questão acima, um laço comum resolve o problema iterativamente. Desta forma, quando o problema é pequeno tente resolvê-lo diretamente e utilizar a recursão apenas quando o problema for grande, consumindo tempo demais em um laço.