domingo, 13 de maio de 2007

POG - Programação Orientada a Gambiarras


Definição de POG
A Programação Orientada a Gambiarras (POG ou WOP - Workaround-oriented programming) é um paradigma de programação de sistemas de software que integra-se perfeitamente a qualquer grande Paradigma de Programação atual.
Por definição, Gambiarra é aquilo que é de difícil concepção, de inesperada execução para tornar fácil o uso de algo que sequer deveria existir.
A Programação Orientada a Gambiarras foi uma evolução natural do uso do Programa Bacalhau, também conhecido como ATND - Artifício Técnico Não Documentado, dos anos 1.960–80, e vem de uma antiga expressão sileira, "Para quem é, bacalhau basta" (época em que o peixe seco ainda era barato). Programadores e analistas mais preocupados em usar buzzwords costumam utilizar o termo workaround para impor respeito.
Para que um programador possa exercer a Programação Orientada a Gambiarras, são necessários alguns fatores específicos, facilmente encontrados em ambientes de desenvolvimento:

Sistemas originalmente mal projetados
Clientes chatos
Usuários chatos
Falta de vontade
Falta de tempo
Criatividade
Gente que pensa que é DBA (normalmente são pessoas chatas, gordas, feias, sem certificação nenhuma e no que fizeram um curso de SQL Básico)
Arquiteto de software achando que é o máximo(normalmente pessoas, altas, loiras, chatas, arrogantes e metidos a sabe tudo)
Término do estoque de café/chá
Aproximação do final da tarde
Véspera de feriado/fim-de-semana
Ter o Jackie Chan como chefe
Ter o MacGyver como coordenador de projeto (ver Método MacGyver)
Governo defecando regras ou MP's que entrem em vigor imediatamente sem dar tempo de atualizar sistemas.
Requisitos dinâmicos e/ou instáveis
Área comercial vendendo ou pré-vendendo produtos imaginários ou inacabados com "entrega garantida em 30 minutos ou seu dinheiro de volta!"
Reunidos, todos estes fatores transformam o programador em um gambiarrizador, espécie mais evoluída de programador, que possui curva de aprendizado e produtividade muito mais altas. Os códigos dos gambiarrizdores podem ser chamados de CACA (Código Avançado Complexo e Adaptável).

Lembre-se que a Microsoft - idealizade direitos, por isso, cuidado para você não precisar pagar royalties á Microsoft. Na próxima versão do Visual Studio, todas as POGs documentadas terão wizards personalizados. Por ser dotado de Inteligência Artificial (já que os programadores VB não possuem inteligência alguma) ele irá tornar o uso transparente ao POGramador.
Estudos realizados neste segmento, mostram que os programadores que evoluem para gambiarrizadores vivem melhor, saem as 18:00h, tem cabelos mais bonitos e esvoaçantes. Tudo pelo fato de que, em gambiarrizadores, eles entram em um estado alfa, onde tudo na vida funciona. Tudo que é impossível torna-se possível, de maneira totalmente obscura, mas possível.
Há correntes de programadores que discriminam a Programação Orientada a Gambiarras, alegando ser uma má técnica, que faz com que os sistemas fiquem lentos e ganhem bugs. Também ficou claro nas pesquisas que estes programadores só dizem isto por nunca terem evoluído para gambiarrizadores (e por isso nunca pegam mulher nenhuma). Com apenas uma evolução (ao contrário de ' como o Charmander, que necessitam de duas para atingir o ápice de seu desenvolvimento), 100% dos programadores admitem que a Programação Orientada a Gambiarras, definitivamente, é o melhor paradigma de todos.
Além disso, a Programação Orientada a Gambiarras, assim como outros paradigmas, deu origem a outros movimentos de pesquisa científica como Modelagem Orientada a Gambiarras (MOG ou WOM - Workaround-oriented modeling), Desenvolvimento de Sistemas Orientado a Gambiarras (DSOG ou WOSD - Workaround-oriented software development).

Interessante Artigo sobre POG da
DESCICLOPÉDIA

sábado, 28 de abril de 2007

Fases do RUP

O RUP, abreviação de Rational Unified Process (ou Processo Unificado da Rational), é um processo proprietário de Engenharia de software criado pela Rational Software Corporation, adquirida pela IBM tornando-se uma brand na área de Software, fornecendo técnicas a serem seguidas pelos membros da equipe de desenvolvimento de software com o objetivo de aumentar a sua produtividade.
Até agora estas linhas de guia são gerais, a serem aderidas ao percorrer do ciclo de vida de um projeto. As fases indicam a ênfase que é dada no projeto em um dado instante. Para capturar a dimensão do tempo de um projeto, o RUP divide o projeto em quatro fases diferentes:

Concepção
: ênfase no escopo do sistema
Elaboração: ênfase na arquitetura
Construção: ênfase no desenvolvimento
Transição: ênfase na implantação

+Projeto KnaiP2P

+Concepção
Identificar Atores
Lista de Eventos
Identificar Casos de Uso
Descrição dos Casos de Uso
Definição planos de Negócios
Definição de Riscos/Sucessos
Reunião Cliente
+Elaboração
Documento Visão Sistema
Diagrama de Caso de Uso
Diagrama de Classe
Diagrama de Colaboração
Diagrama de Sequência
Diagrama de Estados
Prototipação
Reunião Cliente
+Construção
Programacao Servidor
modularização regras segurança
Testes no programa servidor
Modelagem interface servidor
Programacao cliente
Definição regras segurança
Testes no programa cliente
Modularização regras segurança
Modelagem interface
Desenvolvimento Manual/Help
+Implantação
Treinamento Cliente
Instalação
Suporte

O RUP também se baseia nos 4 P's:

Pessoas
Projeto
Produto
Processo

As fases são compostas de iterações. As iterações são janelas de tempo; as iterações possuem prazo definido enquanto as fases são objetivas.
Todas as fases geram artefatos. Estes serão utilizados nas próximas fases e documentam o projeto. Além de permitir melhor acompanhamento.

Clique na imagem para visualiza-la MAIOR

sábado, 21 de abril de 2007

Relacionamentos Caso de Uso

Uma dúvida que surge ao fazer um caso de uso é quando devemos colocar uma função extend ou include ou mesmo uma generalização ?

include



extend



Generalização




Acho que pelos desenhos ficou bem claro quando usar uma e outra...

terça-feira, 20 de março de 2007

Contato Radical




Neste caso, creio que a orca confundiu o cão com um foca, ou mesmo queria ter uma certeza do que era aquilo na embarcação.. Acho que o cachorro teve sorte!



Acho que o gato virou comida... Já que uma aguia consegue carregar um coelho ou mesmo um Suricate..

domingo, 25 de fevereiro de 2007

Modelagem de dados DER 1

Os clientes da agência, armazenando o nome, o endereço (composto de logradouro, número, complemento, cidade, CEP e UF) e os telefones. Para as pessoas físicas, deve-se armazenar também o CPF e RG; e para as pessoas jurídicas, deve-se armazenar o CNPJ e o número de funcionários. Cada cliente recebe um código único ao ser cadastrado. Cada pessoa física pode possuir diversos cartões de crédito, cada qual com um número e uma bandeira (ex: MasterCard, Visa, etc). Os clientes adquirem diversos pacotes turísticos. Cada pacote é identificado por um código e possui uma descrição, data de saída, data de chegada, e valor. Um pacote é adquirido por vários clientes. Os pacotes são formados por diversos pontos turísticos, que podem se repetir em diferentes pacotes. Cada ponto turístico tem uma descrição e está localizado em uma cidade.

Modelagem de dados DER 2



Projetar um Diagrama Entidade-Relacionamento para um sistema de gestão de campeonatos de F1(Fórmula 1). O sistema necessita manter, no mínimo, as seguintes informações:
Os campeonatos disputados, registrando o ano do campeonato, a data de inicio e a data de termino. Os autódromos onde são realizadas as corridas, registrando o nome do autódromo, o país, a data de inauguração, e a extensão (em quilômetros).
As corridas (grande-prêmios) disputadas, armazenando a data da corrida, o horário de início, o
horário de término, e o número de voltas disputadas. Cada corrida pertence a um campeonato e é disputada em um autódromo. Os pilotos participantes de um campeonato, armazenando o nome do piloto, a data de nascimento e o país de origem. Cada piloto estará vinculado a uma equipe durante um ou mais campeonatos. Um piloto não poderã correr por duas ou mais equipes em um mesmo campeonato. As equipes de fórmula 1, registrando o nome da equipe, a data de fundação e o país de origem. A classificação dos pilotos em uma corrida, registrando a posição final e o número de pontos obtidos. Também deve ser registrada a classificação de treino (posição de largada) para cada piloto em umacorrida.

quarta-feira, 21 de fevereiro de 2007

Broly - O lendário Sayajin

A história de Brolly começa com ele compartilhando o mesmo lugar de nascimento que Son Goku e daí o ódio mortal de Brolly por ele. O choro de Goku o irritava e aparentemente fez com que Brolly enlouquecesse. Apesar disto sabemos pouco desta etapa da vida de Brolly. Quase todos os saiyajins morreram perante o ataque de Freeza ao planeta Vegeta. Brolly foi um dos poucos que sobreviveu, junto de Paragus, seu pai, graça ao seu enorme poder ele conseguiu vagar no espaço e se proteger da explosão.
Paragus possuia uma enorme sede de vingança, porque, antes da explosão do planeta Vegeta, o Rei Vegeta, ordenou que matassem Paragus e seu filho Brolly, temendo o poder de Brolly. Paragus argumentou que Brolly seria o único que poderia enfrentar Freeza, mas de nada adiantou e os dois foram gravemente feridos. Para se vingar, Paragus, arquiteta um plano para atrair Vegeta, filho do Rei, para um planeta que está para se chocar com um meteoro. Só que não só Vegeta mas Trunks, Gohan, Mestre Kame, Goku e outros vão para o planeta ajudar Vegeta. Paragus possuia um aparelho que controlava o poder de Brolly, que nem mesmo o próprio Brolly detinha controle sobre o seu poder. Sendo capaz de destruir uma gálaxia inteira, como ele o fez.
Ao ver Goku, Brolly se desencadearia por completo. Não mais, seu pai, Paragus, conseguindo o controla-lo. E Brolly se transforma no Lendário Super Saiyajin. Com essa forma, ele derrota facilmente Trunks, Gohan e Goku. Piccolo chega no momento que ele mataria Gohan que estava agonizando junto com Trunks e Goku que estava morrendo. Com a chegada de Piccolo uma nova batalha começa, mas não muito diferente da primeira, Piccolo antes de ser derrotado por Brolly, mexe com orgulho de Vegeta, fazendo-o entrar no campo de Batalha.
Um a um todos foram sendo vencido facilmente por Brolly, Piccolo, Gohan, Trunks e Vegeta caíram perante o Lendário Super Saiyajin. Somente Goku, manteve-se de pé, muito debilitado e não conseguia manter uma luta com Brolly, que o atacava brutalmente. Goku diante dessa situação, pediu para os guerreiros que foram vencido por Brolly, dessem a ele, a energia que eles possuiam, para assim, poder enfrentar o Brolly. Piccollo, Gohan e Trunks, prontamente doam suas energias para Goku mas Vegeta se recusa a passar sua energia. Após relutar um pouco, Vegeta acaba cedendo e passando sua energia para Goku.
Goku conseguiu reunir o poder de todos os seus amigos em um só golpe, repelindo o ataque de Brolly e o ferindo pela primeira vez gravemente. Não tendo mais tempo, Goku reuni todos os seus amigos, e os sobrevivente do planeta e os teletransporta para a nave em que Piccolo veio. Poucos segundos depois o planeta explode, mas Brolly também consegue fugir em sua nave, mesmo estando gravemente ferido. Brolly ficou vagando no espaço até que chegou a terra. Seu poder incrívelmente alto, permitiu-o uma vida recuperação de todos os seus fermentos da luta anterior com Goku...
Nada haveria de desperta-lo do seu sono profundo, exceto a voz de Goten, que ele imediatamente reconheceu como a de Kakarotto (nome verdadeiro de Goku). O despertar do imenso poder de Brolly teve que ser combatido pelas forças de Goten e Trunks que não conseguiram fazer frente ao Brolly, que se quer precisou usar sua forma de Lendário Super Saiyajin para derrota-los. Gohan, ao sentir o KI de Brolly, vai imediatamente ao campo de batalha, onde Goten e Trunks já haviam sido derrotados por Brolly.
Uma nova batalha se inicia, agora lutando contra Gohan, Brolly usa sua forma de Lendário Super Saiyajin e Gohan não deixa por menos usando sua forma de Super Saiyajin 2. Mesmo estando como Super Saiyajin 2, Gohan não consegue deter Brolly é após lutar contra ele é vencido novamente, sendo salvo por Kurillin.
Goten, que havia reunidos as 7 esferas do dragão junto com Trunks, vendo o esforço heróico do irmão para salva-los pede, indiretamente, as esferas do dragão que os ajudem, e ele é atendido. Shei-Long, trás Goku, para o campo de batalha. Fazendo um triplo Kamehameha, Goku Super Saiyajin, Goten Super Saiyajin e Gohan Super Saiyajin 2, conseguem repelir o ataque de Brolly e joga-lo contra o Sol. Finalmente derrotando e matando um dos mais poderosos guerreiros que apareceu.

Muitos historiadores acreditam que o lendário guerreiro Super Saiyajin, é o Super Saiyajin nível 4. Por isso a existência de Brolly causa muita controvérsia, já que este Super Saiyajin nasceu com uma descomunal força e em muitos livros é considerado o Super Saiyajin da lenda.
kamehamehaaaaaaaaaaaaaaaaaaa um dos desenhos que eu mais gosto... rsss

Ghost Rider


Não aguentei e tive que baixar a versão filmada... Na minha opinião, o filme é... assistível, mas enjoativo, antes do final eu já tinha perdido minha paciência, uma nota ? De 1 a 10 ... nota 6.5 porque eu tive um pouco de paciência para assistir até o final..
Como cada ponto de vista é a vista de um ponto, o que pode ser ruim para mim, pode ser bom para vocês, então não leve minha opinião muito a sério, assista ao filme e dê sua própria nota !
Bom filme pra vocês que ainda não viram...

segunda-feira, 12 de fevereiro de 2007

Busca de Padrões




A busca de padrões (amplamente utilizada na informática) consiste em dado um conjunto de caracteres de tamanho n (que alguns chamam de “texto”) e outro conjunto menor ou igual chamado de padrão (com tamanho m). Assim, é realizada a procura no texto da posição (se ocorrer) referente ao padrão dado. Mais precisamente, queremos achar o índice o qual inicia o padrão no texto. Se for o caso, podemos verificar o texto todo para busca de múltiplas ocorrências. O funcionamento da busca de padrão é simples, se o primeiro caractere é idêntico à um referente no texto, todos os sucessores devem ser idênticos também, até finalizar o padrão. Caso ocorra que um caractere não seja igual, desloca-se o padrão em um caractere até chegar ao fim do texto ou encontrar o padrão.

Algoritmos

#include
#include
#include //fflush(stdin) e
#include //pra pegar o tempo! clock();
#define TAM 1000
//variaveis globais para manipulacao das funcoes abaixo
int comparacoes = 0 ;
int pula[53];
int proximo[11]; //vetor pro KMP proximos valores

//---------------------------------------------------------------------//
//PUC MINAS - SÃO GABRIEL
//Alunos - André Gouvêa Horst
//Data - 4/06/2005
//Programa - varios metodos de reconhecimento de padrão
//---------------------------------------------------------------------//

void pulaKMP(char *p){
int i = 0, j, m = strlen(p);
j = proximo[0] =-1;
while(i while (j>= 0 && p[i] != p[j])
j = proximo[j];
i++;
j++;
if(p[i]==p[j])
proximo[i] = proximo[j];
else
proximo[i] = j;
}
for (i = 0; i < m; i++)
cout<<"proximo ["<}

int kmp(char *p, char *a){
int i, j, m = strlen(p), n = strlen(a);
comparacoes = 0;
pulaKMP(p);
int final;
int inicio = clock();
for(i = 0, j = 0; j < m && i < n; i++, j++){
cout<<"Comprarando "< cout<<"Numero de comparacoes "< cout<<"Tempo "< return i-m;
}
else{
cout<<"Falha! "<<(i)< cout<<"Numero de comparacoes "< cout<<"Tempo "< return i;
}
}

int forcaBruta(char *p, char *a){
int i = 0, j = 0, n = 0, m = 0;
comparacoes = 0;
n = strlen(a);
m = strlen(p);
int final;
int inicio = clock();
for(i = 0, j = 0; j < m && i < n; i=i, j=j){
cout< if (a[i]!= p[j]) {
comparacoes++;
i = i-(j-1);
j = 0;
}
else{
comparacoes++;
i++;
j++;
}
}
final = clock();
if(j == m){
cout<<"Comparacao comeca com "<<(i-m)< cout<<"Numero de comparacoes "< cout<<"Tempo "< return i-m;
}
else{
cout<<"Falha!"<<(i)< cout<<"Numero de comparacoes "< cout<<"Tempo "< return i;
}
}

void initpula(char *p) {
int i, l = strlen(p);
cout<<"pula vetor..."< for(i = 0; i <= 52; i++)
pula[i] = l;
for(i = 0; i <= l - 1; i++){
cout<<"pula["< pula[p[i]-65]= l - 1 - i;
}
cout<}

int boyerMoore(char *p, char *a){
int i, j, t, M = strlen(p), N = strlen(a);
initpula(p);
int final;
int inicio = clock();
for(i = M-1, j = M-1; j >= 0; i--, j--){
while(a[i] != p[j]){
comparacoes++;
cout< i += (M-j > t) ? M-j : t;
if(i >= N){
cout<<"Combinacao nao encontrada! "< return N;
}
j = M-1;
}
comparacoes++;
}
final = clock();
cout<<"Combinacao comeca com "< cout<<"Numero de comparacoes "< cout<<"Tempo "< return i;
}

void main(){
//variaveis com textos default para textes do programa
char t1[] = "CACACAU";
char p1[] = "CACAU";
char t2[] = "GCATCGCAGAGAGTATACAGTACG";
char p2[] = "GCAGAGAG";
char t3[] = "ABACAABADCABACABAABB";
char p3[] = "ABACAB";
//variavel para entrada de dados a partir do teclado
char t[TAM], p[TAM];
int opcao = 0; //para controlar o menu
while(1){
cout<<"\nDigite os valores para testar\n";
cout<<"\n(1) - Texto = CACACAU e Padrao = CACAU ";
cout<<"\n(2) - Texto = GCATCGCAGAGAGTATACAGTACG e Padrao = GCAGAGAG ";
cout<<"\n(3) - Texto = ABACAABADCABACABAABB e Padrao = ABACAB ";
cout<<"\n(4) - Valores digitados a partir do teclado ";
cout<<"\n(5) - Sair do programa ";
cout<<"\n\nEscolha uma opcao ?\b";
cin>>opcao;
if(opcao == 1){
cout<<"\n\n# BOYER-MOORE #\n\n";
boyerMoore(p1,t1);
cout<<"\n\n# KMP #\n\n";
kmp(p1,t1);
cout<<"\n\n# FORCA-BRUTA #\n\n";
forcaBruta(p1,t1);
}
if(opcao == 2){
cout<<"\n\n# BOYER-MOORE #\n\n";
boyerMoore(p2,t2);
cout<<"\n\n# KMP #\n\n";
kmp(p2,t2);
cout<<"\n\n# FORCA-BRUTA #\n\n";
forcaBruta(p2,t2);
}
if(opcao == 3){
cout<<"\n\n# BOYER-MOORE #\n\n";
boyerMoore(p3,t3);
cout<<"\n\n# KMP #\n\n";
kmp(p3,t3);
cout<<"\n\n# FORCA-BRUTA #\n\n";
forcaBruta(p3,t3);
}
if(opcao == 4){
cout<<"digite a sequencia de texto ";
fflush(stdin);
gets(t);
cout<<"digite a sequencia a ser procurada";
fflush(stdin);
gets(p);

if(strlen(t) <= strlen(t)){
int v1=strlen(t),v2=strlen(p);
cout<<"\nTexto nao pode ser maior que o padrao de busca! ";
while(v1 <= v2 ){
cout<<"digite a sequencia de texto ";
fflush(stdin);
gets(t);
cout<<"digite a sequencia a ser procurada";
fflush(stdin);
gets(p);
v1=strlen(t);
v2=strlen(p);
}
}
cout<<"\n\n# BOYER-MOORE #\n\n";
boyerMoore(p,t);
cout<<"\n\n# KMP #\n\n";
kmp(p,t);
cout<<"\n\n# FORCA-BRUTA #\n\n";
forcaBruta(p,t);
}
if(opcao == 5)
exit(1); //força a saida!
} //fim while do menu
} //fim do programa principal

Analise dos algoritmos

Força Bruta


O algoritmo apresentado não é eficiente, pois não usufruiu de nenhuma otimização no processamento dos caracteres. Sua complexidade de tempo é O((n-m+1)*m).

Boyer – Moore

A análise do algoritmo de Boyer- depende apenas do padrão e do alfabeto em questão. A complexidade de tempo e de espaço do BM para esta fase é O(m+c). O pior caso do algoritmo é O(n+M) onde r é igual ao número total de casamentos, o que torna o algoritmo ineficiente quando o número de casamentos é grande. O melhor caso e o caso médio para o algoritmo é O(n/m), ou seja, um resultado muito bom!

KMP

A complexidade do KMP é O(n) + O(m) . Quando se tem textos onde é difícil encontrar palavras que possuem caracteres repetidos, sufixo igual ao prefixo, a complexidade do KMP aproxima-se à do Força-Bruta O(mxn).

domingo, 11 de fevereiro de 2007

P2P


O P2P ou Peer-to-Peer é uma tecnologia para estabelecer uma espécie de rede de computadores virtual, onde cada estação possui capacidades e responsabilidades equivalentes. Difere da arquitetura cliente/servidor, no qual alguns computadores são dedicados a servirem dados a outros. Esta definição, porém, ainda é demasiado sucinta para representar todos os significados do termo Peer-to-Peer.

EA-Share é um programa de comunicação peer-to-peer como o Napster. A idéia é disponibilizar a lista de arquivos locais em um servidor para que todos os clientes possam pesquisá-los. Porém a transferência de arquivos é feita entre cada usuário diretamente sem a passagem dos dados pelo servidor.
O servidor é implementado em Unix e os clientes em Windows . Para isso ele deve fazer o controle das conexões TCP/IP ativas e tratar eventuais desconexões. Deve ser implementado um protocolo simples de mensagens, entrada e saída de usuários. Toda busca de arquivos efetuada por um cliente, é pesquisada nos arquivos do servidor e o cliente deve receber o resultado da busca contendo o número IP dos demais clientes que possuem o arquivo requisitado. A transferência é feita diretamente entre os clientes.


Este foi um trabalho de faculdade na matéria Redes de Computadores, feito no final de ano de 2006.
Este software não tem qualquer tipo de garantia, e o autor não poderá ser responsabilizado por qualquer tipo de prejuízo causado pela sua execução ou distribuição do mesmo. A execução deste programa correrá por sua conta e risco. Este programa tem licença gratuita e pode ser distribuído livremente...

UPDATE 06/05/2007 - Novo Link p/ Download
Download - EA - SHARE (código fonte e executáveis em anexo)

Saiba mais sobre P2P(wikipédia)