Mar 20 2012

Conversão de Imagens para GrayScale/Binária/R/G/B


Boa tarde,

Este é um pequeno exercício de Sistemas Multimidias (INE5431). O mesmo consistia em:

1) Transforme a imagem do elefante em tons de cinza.
2) Gere 3 imagens fazendo a função de split RGB, cada imagens com intensidades luminosas proporcionais a um componente de cor.
3) Implemente um programa que transforme a imagem do elefante em imagem binária.

Primeiramente, como realizar conversão de RGB para Tons de cinza:

Y = 0.3R + 0.59G + 0.11B;

Para realizar a conversão para binário precisamos uma imagem de tons binários e aplicamos a seguinte lógica:

if (Y > 127) {b = 1; } else { b = 0; }

Para deixar somente uma componente de cor, necessitamos manipular a imagem para que a mesma fique somente com a componente que desejamos.

No projeto em anexo, acessamos uma imagem e temos várias funções que realizam a conversão para GrayScale, Binária e Componente RGB. Apartir da imagem original, criamos um Buffer do mesmo tamanho e percorremos os Pixels da imagem original realizamos as transformações adequadas em cada método e jogamos nesse novo Buffer, criando assim uma nova imagem.

Read more »

Oct 19 2009

Nova versão do LURL (Tiny-URL).


Boa noite,

Na primeira versão do LURL (Tiny-URL), o usuário João, sugeriu que em vez de eu gerar um identificador aleatório, que poderia causar problemas quando o banco de dados se tornasse muito grande, eu poderia utilizar o campo ID, pois o mesmo é Auto Increment, e por isso ele se auto incrementa, não permitindo que existam dois campos com o mesmo identificador.

Já pensava em acatar a idéia do João a bastante tempo mas sempre estava com preguiça, até que alguns dias atrás uma amiga pediu ajuda para fazer um script para conversão de números entre bases. Após ajudar a mesma, ficou fácil. Só passar o código para PHP, modificar algumas funções antigas e pronto.

Read more »

Jul 05 2009

Quick Flickr Widget 1.2.10.2, WordPress


Boa tarde,

Atualmente utilizo um Plugin no meu wordpress chamado Quick-Flickr-Widget que é desenvolvido pelo Konstantin Kovshenin e serve para exibir as fotos do seu flickr em seu wordpress com diversas customizações, como filtrar por tags, tamanho da imagem, quantidade de imagens, fotos aleatórias. Eu particularmente não gostava do método que era gerado as fotos aleatórias, ele pegava as suas últimas atualizações e sorteava entre elas, excluindo assim muitas fotos do sorteio. Eu comecei a utilizar este plugin já faz algum tempo e em sua versão 1.2.7, disponibilizei aqui uma versão onde o esquema de sortear aleatoriamente funcionava melhor, o mesmo pegava uma lista de tags, sorteava as mesmas e pegava as últimas atualizações da tag. Entrei em contato com o desenvolvedor e mostrei a minha versão, ele disse que nas próximas versões pretende integrar este recurso desenvolvido por mim. Infelizmente já estamos na versão 1.2.10 e ainda não incluiu essa funcionalidade, então, eu peguei a sua versão 1.2.10 e inclui novamente este recurso de aleatório por tag. Utilizei o número 1.2.10.2 para indicar que é uma versão diferente da original.

Quick-Flickr-Widget 1.2.10.2 - Com aleatorização por tags.

Primeira modificação do Quick-Flickr-Widget na versão 1.2.7.2

Espero que goste,
Matheus

Jul 04 2009

Gráficos para seu Tiny URL.


Boa tarde,

Ontem adicionei controle de estatísticas no Tiny URL, criei 2 tabelas para isso. Porém para consultar você precisava acessar o banco de dados manualmente. Resolvi fazer algo mais decente e criar uns gráficos de acessos dos últimos 30 dias. Pensei em utilizar a Chart API do Google mas ai me lembrei dos gráficos que eram gerados pelo WordPress Stats, dando uma olhada nele descobri o Open Flash Chart. Achei ele mais bonito e com as mesmas funcionalidades do Chart do Google. Então decidi implementar o gráfico com ele.

As novas funções implementadas foram:
getAccess($id) - Tem por função retornar um Array associativo com os números de acessos por data e o total de acessos.
formatData($data) - Recebe os acessos do getAccess e transforma em um array numérico. (Formato necessário para o chart ser gerado)
criarLabels() - Cria os labels para exibição na parte inferior do gráfico.

Para acessar as informações ainda não fiz uma página com a listagem dos domínios, você deve acessar manualmente o endereço http://www.seusite.com/diretorio/chart.php?id=ID onde ID é o UID da tabela URLS. Assim você obterá um gráfico de acessos ao domínio do UID nos últimos 30 dias.

Exemplo de exibição:


Tiny URL, com estatísticas e exibição em gráfico

Como criar seu próprio tiny url
Estatísticas no seu Tiny URL

Espero que seja util para você,
Matheus

PS2: Para seu Tiny URL funcionar, você deve adicionar algumas regras de Rewriting. Você pode ver elas em Criar um sistema próprio de Tiny-URL

Jul 02 2009

Estatísticas no seu TinyURL.


Olá,

Algum tempo atrás eu mostrei como criar um sistema próprio de Tiny-URL, estava curioso para saber como andavam os acessos aos meus links distribuidos por outros endereços, decidi implementar um sistema simples de controle de acessos.

Inicialmente você precisa adicionar estas duas tabelas em seu banco de dados:

CREATE TABLE access (
  aid INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
  urls_uid INTEGER UNSIGNED NOT NULL,
  information_iid INTEGER UNSIGNED NOT NULL,
  date DATE NULL,
  PRIMARY KEY(aid),
  INDEX access_FKIndex1(information_iid),
  INDEX access_FKIndex2(urls_uid)
);

CREATE TABLE information (
  iid INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
  ip VARCHAR(255) NULL,
  PRIMARY KEY(iid)
);

Após isso você deve fazer umas alterações no seu function-little-url.php mais especificamente no take_url($ur) deixe-o da seguinte maneira:

function take_lurl($lurl) {
        global $link;
        $q = "SELECT * FROM `urls` WHERE `unique_chars` = '".$lurl."'";
        $r = mysql_query($q, $link); // Realiza consulta.
        if(mysql_num_rows($r)>0) {
                 $info = mysql_fetch_array($r);
                 $url = $info["url"]; // Pega endereço real
                 $uid = $info["uid"]; // Pega ID do endereço
                 $ip = $_SERVER['REMOTE_ADDR']; // Pega IP do usuário
                 $qr = "select iid from `information` where ip = '".$ip."'" ;
                 $rr = mysql_query($qr, $link);  // Procura se este IP já está no banco de dados
                 if(mysql_num_rows($rr)>0) { // Caso esteja insere somente um acesso novo proveniente deste IP
                        $iid = mysql_result($rr,0,"iid");
                        mysql_query("INSERT INTO `access` (urls_uid,information_iid,date) values (".$uid.", ".$iid.", now())", $link);
                 } else { // Caso não esteja, cria um registro com este IP e após cria um acesso.
                        $qr = mysql_query("INSERT INTO `information` (ip) values ('".$ip."')", $link);
                        $iid = mysql_insert_id($qr);
                        mysql_query("INSERT INTO `access` (urls_uid,information_iid,date) values (".$uid.", ".$iid.", now())", $link);
                 }
        } else {
                echo "Sorry, link not found!";
        }
        return $url;
}

Neste sistema, existe uma tabela de IPs que já acessaram as URLs, quando uma nova URL é consultada, ele verifica se o IP já está cadastrado, caso esteja cria somente um novo acesso para esse IP no endereço X, caso não esteja cadastra este IP e cria o acesso para este IP no endereço X.

Como criar um Tiny URL com suporte para estatisticas

Matheus

PS: Para consultar os acessos você deve acessar seu banco de dados e realizar consultas manualmente.
PS2: Para seu Tiny URL funcionar, você deve adicionar algumas regras de Rewriting. Você pode ver elas em Criar um sistema próprio de Tiny-URL

Edit: Corrigido erro que não adicionava a data e hora quando o IP já estava na tabela.

May 28 2009

Exercícios, Programação Concorrente.


Boa noite,

Amanhã tenho uma prova de Programação com o conteúdo, "monitores" e "redes de petri". O professor passou uns exercícios para que fossem resolvidos e entregues, dos 5 resolvi apenas 3 até o momento. A linguagem utilizada para implementação dos mesmos foi Pascal FC (uma linguagem para ensinar "programação concorrente"). Bom, vamos a resolução e enunciados dos mesmos.

1) Pombos correio foram treinados para transportar cartas da cidade
A para a cidade B. Na cidade A existe uma Caixa Postal onde as
pessoas depositam suas cartas para que sejam entregues na cidade
B. Os pombos consultam a Cxpostal e retiram sempre 5 cartas para
transportar na sua viagem. Caso não existam ainda 5 cartas na
caixa, o pombo espera até que esse número seja atingido. Na cidade
B existe uma gaiola onde os pombos depositam suas cartas e ficam
presos até que um processo tratador libere-os. O tratador verifica a
gaiola a cada 20 clocks e libera todos os pombos somente se o
número de pombos for maior ou igual a 2. Os pombos somente
transportam cartas de A para B, na sua volta eles voam vazios.
Construa um monitor para controlar a utilização da Caixa Postal
pelas pessoas (13), pombos (6) e o tratador (1).

Resolução do exercício sobre pombos.

2) Implemente o problema dos fumantes utilizando monitor. Três
fumantes e um agente sentados em uma mesa. Cada fumante
possui dois dos três ingredientes para se fazer um cigarro: fósforo,
fumo e palha. O agente possui os três e aleatoriamente sorteia um
dos ingredientes. O fumante contemplado faz o seu cigarro, fuma e
libera o agente para fazer novo sorteio.

Resolução do exercício sobre mesa de fumantes.

3) Processos produtores e consumidores se sincronizam através de
um buffer circular com 5 posições (um array de 5 posições). Um
produtor gera um número aleatório e coloca no buffer caso exista
uma vaga. Um consumidor retira um número do buffer se houver.
Implemente utilizando monitor.

Resolução do exercício sobre sincronização através de array circular.

4) Suponha um ambiente em que processos compartilham
impressoras. Existem dois tipos de impressora: tipo A e Tipo B.
Existem 3 classes de processos: classe PA que somente utilizam
impressoras do tipo A, classe PB que somente utilizam impressoras
do tipo B e classe PAB que utilizam impressoras de qualquer tipo.
Esses processos, do tipo PAB, têm prioridade sobre os demais
quando não houver impressoras disponíveis. Implemente utilizando
monitor.

Resolução do exercício sobre impressoras.

5) Implemente o problema da ponte utilizando monitor. Uma ponte,
que separa duas cidades A e B, somente permite tráfego em um
sentido de A para B ou de B para A. Se a ponte estiver vazia pode
ser utilizada por carros de A ou de B. Se um carro de A acessou a
ponte, ela é trancada para os carros de B e todos os carros de A que
desejarem podem também acessar. Quando o último carro que sai
de A para B deixar a ponte, ela deve ser liberada.

Resolução do exercício sobre Ponte.

Lista dos 5 exercícios e sua resolução.

UPDATE 1: Exercícios que não estavam resolvidos foram resolvidos e adicionados. Lembro que o professor ainda não entrou uma correção do mesmo, mas testei eles e parece-me tudo ok.Lembrando também que estes exercícios foram disponibilizados aos alunos pelo Professor José Mazzucco Júnior.

Espero que isso seja util a todos,
Matheus

May 09 2009

Criando seu Proprio Tiny-URL.


Boa noite a todos,

Ontem pela madrugada estava pensando no Twitter e que ele reduz urls grandes automaticamente para um sistema escolhidos por eles. Então, estava a pensar em como fazer o meu próprio sistema criação de urls pequenas (tiny url) e pesquisei um pouco no Google. Achei várias referências que utilizei como base para elaboração do meu e os links das mesmas você poderá encontrar no final deste post.

Primeiramente você deve criar uma tabela em seu banco de dados com as seguintes características:

# CREATE TABLE IF NOT EXISTS `urls` (
# `uid` int(11) NOT NULL auto_increment,
# `url` text default NULL,
# `unique_chars` varchar(25) BINARY NOT NULL,
# PRIMARY KEY (`uid`),
# UNIQUE KEY `unique_chars` (`unique_chars`)
# );

Este código foi pego do Abhise no seu post "Create your own tinyurl with php and mySQL" que foi minha maior referência, da mesma peguei várias funções mas realizei algumas alterações para melhor eficiência e também tradução para você. Como no código acima foi adicionado o 'BINARY' para o unique reconhecer diferença entre AAAA e aaaa, por exemplo.

O Abhise diz para criarmos tais e tais arquivos, eu particularmente, criei um arquivo de funções onde adicionei as diversas funções utilizadas e simplesmente chamei as mesmas nos seus respectivos arquivos.

---- Para ler o artigo inteiro acesse o link abaixo.
Read more »

May 06 2009

Quick Flickr Widget, WordPress.


Boa tarde,

Hoje pela tarde estava a estudar e nos interva-los dos estudos estava dando uma olhada nos plugins para o wordpress. Achei um interessante. O Quick-flickr-widget. Um widget para exibir fotos do flickr no seu site. Você pode configura-lo de diversas maneiras, para pegar as ultimas fotos, para utilizar tags, para pegar fotos random. Está ultima, eu não me simpatizei muito, já que ela utiliza de um feed disponivel pelo flickr com suas ultimas atualizações. Fiquei um tempo pensando sobre como melhorar este recurso e tive uma idéia ao me lembrar de outro widget. Eu poderia pegar todas as tags, embaralhar as mesmas e escolher uma aleatoriamente e utilizar esta tag como parametro para uma consulta randomica. Fazendo um random de TAG e em seguida das fotos que possuiam a tag.

Após algumas pesquisas na API do flickr e em outros widgets descobri como poderia pegar as tags. Criei uma função que retornava uma tag aleatoria para o usuario X.

Implementei na mão isso dentro do código do quick flickr widget porém ainda não estava satisfeito, queria compartilhar isso com outros usuarios que também não gostavam da randomização do widget. Então estudei um pouco o codigo do quick flickr widget e fiz algumas modificações, adicionei uma nova checkbox para selecionar se deseja ou não a randomização por tag, adicionei um if e algumas outras linhas necessarias para salvar/pegar está nova opção e pronto.

Testei meio que por cima, as combinações de opções, ativar e desativar e está funcionando. Entrei em contato com o autor para ver se ele tem interesse de disponibilizar essas funções no widget dele. Bom, mesmo que ele não queira, você pode baixar o widget com as modificações aqui.

Então é isso. Quick-Flickr-Widget com randomização por tags.

Até mais,
Matheus Bratfisch

PS: Deixei a versão do mesmo como 1.2.7.2 provisoriamente, já que eu realizei as atualizações em duas etapas adicionei o .2 na versão atual do widget. Provavelmente se o autor for utilizar essa mudança a versão será outra.

May 06 2009

Lista encadeada, Estrutura de dados.


Saudações,

Para não perder o costume, irei postar outro exercicio resolvido em uma aula. Dessa vez o exercicio é o seguinte:
- Implemenetar o sistema de contabilidade de um mafioso. (outros detalhes continue lendo o post)

O enunciado do mesmo se encontra no "read the rest of this entry" para não deixar o post muito extenso devido ao longo enunciado.

A resolução do mesmo você pode baixar aqui.

Read more »

Apr 29 2009

Lista com ponteiros, Estrutura de Dados.


Boa noite a todos,

Como ainda não produzi nada muito bom hoje em casa (no lab produzi algo relaciona a xml-rpc que pretendo postar em breve), resolvi postar mais um dos 198578951 exercicios que estou tendo que fazer para estrutura de dados. O Exercicio de hoje é nada mais nada menos que uma implementação de uma Lista com Ponteiros, ou seja, ela não tem limite de elementos (é claro, se a memoria for infinita).

Como no exercicio anterior, o enunciado fica para a pagina inteira pois é muito grande.

O exercicio resolvido você encontra aqui.

Read more »