terça-feira, 31 de março de 2009

Principais comandos do PHP para Mysql

Pessoal, esta é uma lista dos principais comandos que você irá utilizar quando construir uma página web com PHP e Mysql.

Esse material será muito útil por o Mysql ser um dos SGBDs mais utilizados quando falamos em em banco de dados online.

A tabela abaixo contém o comando e a descrição do que ele faz. Caso possua dúvida, comente.

Comandos
Descrição
mysql_affected_rows Retorna o número de linhas afetadas por uma consulta
mysql_close Fecha a conexão com o banco de dados MySQL
mysql_connect Abre a conexão com um banco de dados MySQL
mysql_create_db Cria um banco de dados MySQL
mysql_data_seek Move o ponteiro interno de uma consulta
mysql_db_query Envia uma consulta MySQL para o banco de dados
mysql_drop_db Exclui um banco de dados MySQL
mysql_errno Retorna o número do erro da última chamada MySQL
mysql_error Retorna a mensagem de erro da última chamada MySQL
mysql_fetch_array Retorna o resultado de uma consulta como array
mysql_fetch_field Retorna informações sobre um campo da consulta (objeto )
mysql_fetch_lengths Retorna o tamanho máximo de cada campo em uma consulta
mysql_fetch_object Retorna uma linha da consulta como um objeto
mysql_fetch_row Retorna uma linha da consulta como um array
mysql_field_name Retorna o nome de um campo da consulta
mysql_field_seek Posiciona o ponteiro para um campo específico da consulta
mysql_field_table Retorna o nome da tabela à qual o campo pertence
mysql_field_type Retorna o tipo de dado do campo
mysql_field_flags Retorna os flags associados a um campo da consulta
mysql_field_len Retorna o tamanho de um campo da consulta
mysql_free_result Libera os recursos alocados a uma consulta
mysql_insert_id Retorna o ID da última cláusula INSERT executada
mysql_list_fields Relação de campos de uma consulta
mysql_list_dbs Lista os Bancos de Dados disponíveis no Sevidor
mysql_list_tables Lista as tabelas existentes em um Banco de Dados MySQL
mysql_num_fields Retorna o número de campos de uma consulta
mysql_num_rows Retorna o número de linhas de uma consulta
mysql_pconnect Estabelece uma conexão persistente com o Banco de Dados
mysql_query Envia uma consulta SQL ao Banco de Dados MySQL
mysql_result Retorna os dados de uma consulta
mysql_select_db Seleciona um Banco de Dados MySQL
mysql_tablename Retorna o nome da Tabela de um campo.

Material retirado de http://imasters.uol.com.br/

quinta-feira, 26 de março de 2009

Ajax - Introdução

Uma breve introdução para quem quer conhecer o AJAX.


AJAX significa Asynchronous JavaScript And XML.

AJAX é um tipo de programação que se tornou popular em 2005 pela Google.

AJAX não é uma linguagem de programação nova, mas uma nova maneira de usar padrões existentes.

Com AJAX você pode criar aplicações web melhor, mais rápidas e mais amigáveis.

AJAX é baseado em JavaScript e requisições HTTP.


Antes de começar a trabalhar com AJAX você deve ter uma noção de HTML/ XHTML e Javascript.


AJAX = Asynchronous JavaScript and XML

Como falei anteriormente o AJAX não pode ser considerado como uma nova linguagem de programação, porque ele utiliza linguagens já conhecidas em sua base. Linguagens como Javascript e html.

Com AJAX, seu código JavaScript pode comunicar diretamente com o servidor, utilizando o XMLHttpRequest, que é um objeto do Javascript. Com este objeto, seu código pode trocar dados com o servidor Web sem recarregar a página inteira.

AJAX utiliza transferência de dados assíncrona (requisições HTTP) entre o navegador e o servidor Web, permitindo páginas requisitarem pequenos bits de informação do servidor ao invés de requisitar toda a página.

A tecnologia AJAX faz as aplicações Web ficarem menor, mais rápidas e muito mais amigáveis.


AJAX é baseado nos padrões Web

AJAX é baseado nos seguintes padrões Web:

  • JavaScript
  • XML
  • HTML
  • CSS

Os padrões Web utilizados no AJAX são bem definidos e suportados pela maioria dos navegadores (Internet Explorer 5.0+, Safari 1.2, Mozilla 1.0 / Firefox, Opera 8+, and Netscape 7). Eles também são independentes da plataforma. Roda tanto em Windows como em Linux.

Fonte: http://www.w3schools.com/ajax/

Javascript - Tipos de dados

O javascript possui poucos tipos de dados, sendo eles :

Numéricos

Este tipo de dado armazena valores, tanto valores inteiros como ponto flutuante, por exemplo :

  • 1
  • 84
  • 2e10
  • 3.141516
  • 0.000001

Os valores numéricos podem fazer parte de operações aritméticas, como a soma, subtração, multiplicação e divisão.

Valores numéricos também podem fazer parte de operações aritiméticas de bits. Como por exemplo (>>) rotação de bits para direita, (<<) rotação de bits para esquerda, (>>>) rotação de bits a direita sem levar em conta o sinal, (^) OU exclusivo (= XOR), (&) operação E binária (= AND), (|) operação OU binária (= OR), (~) Negação binária (= NOT).

Existem várias funções para manipulação de valores numéricos, como funções trigonométricas, funções de arredondamento e exponenciação, funções de transformação de tipos, etc.

Existem alguns valores numéricos especiais, são eles :

  • NaN - Na verdade NaN é a abreviação de (Not a Number) = (Não um Número), ele é o resultado geralmente de operações inválidas com números. Como por exemplo, o resultado da operação (0/0), irá resultar no NaN. Ele também é uma constante, que pode ser atribuida a uma variável, como veremos mais adiante.
  • Infinity - Representa um valor infinito, podendo ser tanto positivo quanto negativo. Todas as operações com valores infinitos resultarão num valor infinito, exceto divisão e subtração que resultará no NaN.

Lógicos

Os valores lógicos podem assumir dois valores, true (verdadeiro) e false (falso).

Strings

São cadeias de caracteres, o maior número que uma string pode conter depende do navegador em uso.

Valores strings são valores delimitados por apóstrofo(') ou por aspas("), ex:

"texto" ou 'texto'

uma barra inversa permite a inserção de caracteres especiais, ex:

"\b" - Representa o backspace (caracter ascii 8)
"\t" - Tabulação (caracter ascii 9)
"\r" - Retorno de carro (caracter ascii 13)
"\n" - Nova linha (caracter ascii 10)
"\v" - Tabulação vertical (caracter ascii 11)
"\uNNNN" - Caracter unicode (NNNN representa um valor hexadecimal de 0000 a FFFF)
"\xNN" - Caracter ascii (NN representa um valor hexadecimal de 00 a FF)
"\'" - Apóstrofo
"\"" - Aspas
"\\" - Barra inversa

Null

O null é um valor especial, representa um objeto nulo, não deve ser confundido com uma variável não inicializada, pois o valor null existe.

Portanto uma variável com o conteúdo null existe em memória, referenciando este objeto especial.

Undefined

O valor undefined significa que a variável não foi instanciada, inicialmente todas as variáveis se encontram neste estado.


Fonte: http://pt.wikibooks.org/wiki/Javascript:_Tipos_de_dados

segunda-feira, 23 de março de 2009

Como enviar email com o PHP

Galera, hoje estou postando uma forma bem simples de enviar e-mail utilizando o php. É claro que a aplicação deve rodar no servidor de e-mails, senão não funciona.

Dependendo da sua configuração do php, você terá que mexer no php.ini.

Obs: A mensagem não poderá ter mais que 70 caracteres em cada linha. Para contornar esse problema coloque \n para pular linha e escrever um texto com várias linhas.

O parâmetro cabeçalho não é obrigatório. Nele você define os parâmetros como: From, CC, BCC.

<?php

$remetente = "xupisco@teste.com";
$destinatario = "programacao@teste.com";
$assunto = "Testar e-mail";
$mensagem = "Teste de envio de e-mail com PHP.";

$cabecalho = "From: $remetente";

mail($destinatario,$assunto,$mensagem,$cabecalho);

echo "E-mail enviado com sucesso!";
?>

Caso possuam dúvidas, comentem.

Sql Server - Tipo de Dados

Tipos TextoTipos Numérico
Tipos Data/Hora
Além dos tipos de dados tradicionais, o Sql Server possui alguns tipos úteis e diferentes: sql_variant, xml, cursor, table.

Fonte: http://www.w3schools.com/sql/sql_datatypes.asp

MySql - Tipos de Dados

No MySql existem 3 tipos de dados principais: Texto, Numérico, Data/Hora.

Tipo de dados: Texto
Tipo de dados: Numérico
Os dados do tipo integer possuem uma opção extra chamada UNSIGNED. A diferença é que UNSIGNED aceita apenas números positivos.

Tipo de dados: Data/Hora
Fonte: http://www.w3schools.com/sql/sql_datatypes.asp

MS ACCESS - Tipos de dados

Pessoal, eu estava fazendo uma pesquisa e achei interessante colocar no meu blog os tipos de dados do MS ACCESS. Apesar de não ser um banco muito robusto, ele ainda é muito usado para pequenas e médias aplicações.


Fonte: http://www.w3schools.com/sql/sql_datatypes.asp

sexta-feira, 20 de março de 2009

Mini-Aula - Introdução a Engenharia de Softwares

Essa é pra galera que está começando a graduação quer aprender um pouco da Engenharia de Softwares.

Introdução a Engenharia de Softwares - Parte 1
http://duvidasdeprogramacao.blogspot.com/2009/03/introducao-engenharia-de-softwares.html
Introdução a Engenharia de Softwares - Parte 2
http://duvidasdeprogramacao.blogspot.com/2009/03/introducao-engenharia-de-softwares_10.html

Introdução a Engenharia de Softwares - Parte 3
http://duvidasdeprogramacao.blogspot.com/2009/03/introducao-engenharia-de-softwares_3313.html

Introdução a Engenharia de Softwares - Parte 4
http://duvidasdeprogramacao.blogspot.com/2009/03/introducao-engenharia-de-softwares_13.html

Tabela de cores CSS

As tabelas abaixo mostram uma lista de nomes das cores que são suportadas pela maioria dos browsers de internet.

Obs: Não confundir esta lista de cores CSS, com as cores em HTML. Você pode usar os valores Hexadecimais em HTML, mas ele não reconhecerá todos os nomes.

De acordo com os padrões definidos pela W3C, existem 16 cores de nomes válidos: aqua, black, blue, fuchsia, gray, green, lime, maroon, navy, olive, purple, red, silver, teal, white, and yellow.

As tabelas estão ordenadas pelo nome da cores.
Clique nas imagens para ampliá-las.


quinta-feira, 19 de março de 2009

WMSWM 2009 - 6º Workshop de Manutenção de Software Moderna



Diversos estudos apontam para a manutenção como sendo a fase mais custosa do ciclo de vida do software, responsável por até 90% do custo total e por até 60% do esforço total.

Manutenção de software pode ser definida como a atividade durante a qual ocorrem modificações em um ou mais artefatos resultantes do desenvolvimento de um software, buscando mantê-los disponíveis, corrigir suas falhas, melhorar seu desempenho e adequá-los a requisitos novos ou modificados.

De acordo com algumas estimativas, em torno de 250 bilhões de linhas de código estavam em fase de manutenção no ano 2000. Somente nos EUA o mercado de manutenção de software movimentava cerca de 70 bilhões de dólares anuais em 1993.


A manutenção ocorre por diversos fatores, como mudanças nos requisitos, mudanças no ambiente, descoberta de falhas nos programas, necessidade de melhoria do desempenho ou legibilidade do software, necessidade de migração para novas tecnologias ou plataformas etc.

Apesar de ser uma área estabelecida, comprovada pela existência de normas revisadas, o surgimento de novos paradigmas de desenvolvimento (ex: dirigidos a modelos, aspectos, componentes e serviços), novas organizações de equipes (ex: desenvolvimento global, eXtreme Programming e open source), novas restrições de escopo (ex: entregas curtas e escopo variável), etc, reanimam a área com novos desafios.

Embora existam diversos métodos de reengenharia consolidados, essas novas abordagens de desenvolvimento trazem a necessidade de novas propostas, a fim de permitir, principalmente, o reaproveitamento do conhecimento e esforço dos sistemas legados em novas plataformas de software.

Diante do esforço de manutenção e dos novos cenários de desenvolvimento, percebe-se a necessidade do surgimento e aprimoramento de métodos, técnicas, abordagens, métricas e ferramentas na área.


Tópicos de Interesse


O WMSWM é um fórum dedicado a discutir e refletir sobre alternativas para
realizar manutenção e reengenharia em sistemas, de tal forma que o processo de
realização e o produto final atendam aos requisitos de qualidade. Os tópicos
de interesse incluem, entre outros:

- Processos modernos de manutenção
- Métricas e qualidade para a manutenção
- Manutenção de sistemas "não tradicionais" (aplicações web, sistemas
baseados em componentes, orientados a aspectos, baseados em modelos,
linhas de produto de software, serviços etc.)
- Ferramentas e ambientes para a manutenção
- Engenharia reversa
- Análise estática e análise dinâmica de software
- Técnicas de visualização e apoio à compreensão de programas
- Reengenharia e migração de sistemas
- Ensino da manutenção
- Experimentação em manutenção
- Modelo de desenvolvimento MDA e manutenção
- Gestão da manutenção (gestão de riscos, gestão de configuração, planejamento
e estimativas)
- Teste de sistemas legados
- Aspectos econômicos da manutenção (custo da manutenção, estimativa
prévia de esforço, etc.)



Premiação


Será conferido um certificado ao melhor artigo técnico e melhor relato
de experiência. A escolha dos melhores artigos será feita em conjunto
com o comitê diretivo do WMSWM.

Os melhores artigos serão convidados ainda para publicação em uma revista
científica nacional.

http://www.wmswm2009.cefetcampos.br/

15 Dicas para programar com saúde

Pra nós que somos programadores compulsivos, e que as vezes ficamos horas e até dias na frente do computador, é fundamental conhecer os problemas que aparecem por falta de cuidados com a postura. Mas só conhecer os problemas não é suficiente, então vamos ver também alguns pontos importantes que nos ajudam no dia-a-dia.




Entre os principais problemas de um mobiliário inadequado estão:




  • Assento demasiado alto e não regulável, responsável por cansaço e dores no quadril.

  • Assento não moldado segundo as depressões do corpo (curva das pernas, principalmente), o que pode provocar dores musculares e até varizes.

  • Falta de regulagem da altura e do ângulo do encosto, provocando dores nas costas e na regial renal.

  • Apoio para os braços mal projetado, dificultando a apŕoximação à mesa e levando à posturas incorretas.

Fonte: http://administrando.net/escolhendo-a-cadeira-ideal/



Agora fique atento as dicas para evitar esses problemas.







Digitação

  • Não repita os mesmos movimentos com as mãos por muito tempo;
  • Realize uma digitação suave;
  • Conserve as mãos retas.

Conforto para os olhos
  • Diminua o brilho e os reflexos na tela do monitor;
  • Use um protetor antiofuscante para tela.

De olho na tela
  • O monitor deve estar a uma distância de aproximadamente 70 cm do rosto;
  • A altura deve estar no nível dos olhos ou um pouco abaixo deles.
Conforto para o corpo


  • Procure manter a curva natural das costas;
  • Nunca fique curvado para frente.

Atenção com a cabeça e o pescoço
  • Evite torcê-los ou sacudi-los de forma repetitiva.

Capriche na cadeira
  • Priorize a compra de uma cadeira confortável, ótimo acessório para minimizar o estresse do corpo.;
  • Ela deve ter um encosto ajustável (para frente e para trás), que permita uma reclinação de até 30 graus;
  • Prefira encostos altos, pois garantem maior apoio para as costas, diminuindo a tensão localizada;
  • Verifique se a cadeira oferece suporte para a região lombar, descanso de braço com almofadas e uma base com cinco pernas para reduzir o risco de quedas.
Boa Circulação
  • Digite com os braços formando um ângulo de 90 graus. Isso é importante para garantir a boa circulação sangüínea nos membros superiores.

No Chão
  • Apoie a planta dos pés no chão, permitindo que eles fiquem retos;
  • Se a cadeira for muito alta, coloque livros ou outro tipo de apoio sob os pés;
  • Lembre-se ainda de manter os joelhos flexionados num ângulo de 90 graus.
Parada Obrigatória


  • É saudável estipular períodos de descanso para a vista;
  • Para cada 2 horas de trabalho, recomenda-se um intervalo de 15 minutos;
  • Quem trabalha todo o tempo olhando para a tela deve optar por uma pausa de 15 minutos em cada hora de serviço.
Passeios Esporádicos


  • Por mais correta que seja sua postura, a pressão sobre os discos lombares aumenta em até 30% quando você está sentado. Faça passeios esporádicos.

Teclados Ergonômicos

  • Não se empolgue com a bela aparência desses periféricos;
  • Prefira os modelos com suporte de pulso, que deve ser grosso e almofadado e estar no mesmo nível físico do teclado - nunca abaixo.
Luz
  • A iluminação precisa ser controlada para não se sobrepor à tela ou produzir reflexos indesejados;
  • Dê preferência aos lustres com ajuste manual;
  • Confira se a luminosidade está adequada: olhe para a tela do micro - não pode haver pontos de luz notáveis atrás ou ao redor dela.
Pernas Livres


  • Considere a utilização de um móvel que permita bom espaço para movimentação das pernas e ofereça altura suficiente para posicionar o teclado de forma correta - aproximadamente 70 centímetros do chão.


Fadiga

  • Distancie seus olhos do monitor a cada 10 minutos, focalizando-os o mais longe possível durante 5 segundos. Esse procedimento minimiza a fadiga ocular.

O Poder do Mouse

quarta-feira, 18 de março de 2009

Novo Python 3.1


Python, uma das 10 linguagens mais utilizadas no mundo da programação disponibiliza sua mais nova versão 3.1.

Veja log de mudanças, a documentação online, e principalmente baixe para testar.

Caso encontre algum erro, você pode reportá-los.

link: http://www.python.org/download/releases/3.1/

6 Dicas importantes de Linux


1. Matar um processo

É uma situação muito chata quando você vai mostrar uma música, vídeo, pra algum amigo seu e o processo trava com aquela frase chata. "Process is already running" - Processo já em execução

Se você não sabe matar o processo, fica uma situação muito chata.
Então vamos aprender a matar um processo:

Entre no terminal e digite:
ps -aux

Veja o PID (número) do processo que deseja parar.

Digite:
kill -9 PID
troque o PID acima pelo número do processo e está pronto. Processo apagado!


2. Ver as últimas mensagens de log

Digite:
tail -f /var/log/messages


3. Desabilitar o beep do sistema

O Linux insiste com aqueles beeps chatos? Não adianta desligar o som do pc, porque isso é som do sistema e o jeito de desligálo é:

Digite:
sudo rmmod pcspkr


4. Filtrar Websites

Se seu filho ou outras pessoas que utilizam seu pc estão entrando em sites indesejáveis. Como fazer para bloqueá-los?

Abra o terminal e edite o seguinte arquivo:
gedit /etc/hosts

...você pode usar qualquer editor de sua preferência.

Dentro do arquivo, adicione:
127.0.0.1 site.com.br

...Troque site.com.br pelo site que você deseja bloquear. Você pode adicionar quantas linhas quiser.


5. Baixar um site

No terminal, digite:

wget http://www.duvidasdeprogramacao.blogspot.com

.... para baixá-lo por completo.


6. Executar Comandos já executados

Procurando aquele comando enorme que você digitou anteriormente e não quer digitar novamente? Encontre-o no terminal:

Digite:
history grep -i "palavras"

...Troque "palavras" pelo comando que deseja procurar. Após isso aparecerá no terminal os comandos encontrados com um número de ID.

Para executá-lo sem digitar novamente, digite:
! IDnumber

HTML/CSS - Class x ID

Se você tem dúvidas de quando usar a tag class e a tag ID, você verá as principais diferenças e utilização de cada uma com exemplos e definições.



Class

Com a tag class você pode definir diferentes estilos para o mesmo tipo de elemento HTML.

Exemplo:

Digamos que você gostaria de ter dois tipos de parágrafos na sua página: Um parágrafo alinhado a direita, e outro alinhado ao centro.

Aqui está como você pode fazer isso com CSS:

p.right {text-align: right}

p.center {text-align: center}


Você tem que usar o atributo class na sua página HTML:


Obs: Para aplicar mais de uma class por elemento, use a seguinte sintaxe:


O parágrafo acima será estilizado pela class "center" e a class "bold".


Você também pode omitir o nome da tag para definir um estilo que será usado por todos elementos HTML que possuirem esta class.

No exemplo abaixo, todos elementos HTML com class="center" será alinhado ao centro.

.center {text-align: center}


No código abaixo, ambos os elementos h1 e p tem a class="center". Isso significa que ambos elementos seguirão as regras so seletor ".center".




Id

Você também pode definir estilos para elementos HTML usando o seletor Id. O seletor Id é definido com um "#" (famoso jogo da velha).

Obs: O atributo Id somente terá um único valor para uma página HTML.

A regra de estilo abaixo irá trocar o elemento que possui um atributo Id com o valor de "green":

#green {color: green}


A regra de estilo abaixo irá trocar o elemento p que tem um Id com o valor de "para1":



RESUMINDO


Usamos a tag class quando:

O estilo é usado em vários locais através da página.

O estilo é bem genérico.


Usamos a tag id quando:

O estilo é usado apenas uma vez na página.

O estilo é específico para uma certa área da página.

Escrevendo CSS de maneira rápida (Shorthand)



Shorthand é uma maneira mais rápida e compacta de escrever seu código CSS. E além disso deixa seu código muito menor, mais limpo e de mais fácil entendimento.

Vamos ver alguns exemplos:

Você provavelmente criaria seu código assim:


.header {
background-color: #fff; //cor do fundo
background-image: url(teste.gif);//imagem
background-repeat: no-repeat; //sem repetição
background-position: top left; //posição
}


Não seria muito melhor escrito assim:


.header {
background: #fff url(teste.gif) no-repeat top left
}


Outro exemplo: Tag <font>

Sintaxe

font: font-style | font-variant | font-weight | font-size | line-height | font-family


p {
font: x-large/110% "new century schoolbook", serif;
}


Para saber a sintaxe dos elementos que utilizam shorthands visite http://www.w3schools.com/CSS/css_reference.asp?output=print

Não sabe o que é CSS? Acesse: Introdução ao CSS

Exemplos de Menu CSS



Pessoal, estou disponibilizando um link com vários tipos de menu feito em CSS. Clique no link abaixo para ver os menus, e para ver o código acesse o código fonte com o botão direito sobre a página.

Aqui está o link:

sexta-feira, 13 de março de 2009

Introdução a Engenharia de Softwares - Parte 4

Pessoal, vamos falar um pouco mais sobre software!?

Os softwares tem características interessantes. Por isso acho que vale a pena escrever um pouco mais.

Definição de software

"Instruções (programas de computador) que, quando executadas, produzem a função e o desempenho desejados.

Estruturas de dados que possibilitam que os programas manipulem adequadamente a informação.

Documentos que descrevem a operação e o uso dos programas."

De acordo com os mais estudados no assunto, softwares não são apenas "programinhas de computador", e sim algo muito mais complexo. Os softwares são o conjunto dos elementos citados acima: Instruções (programa propriamente dito), Estruturas de dados (banco de dados, arquivos, hashmap, etc) e documentos (manuais, documentação de projeto, etc).

Características dos Softwares:


1. O software é desenvolvido ou projetado por engenharia, não manufaturado no sentido clássico.

O gráfico abaixo conhecido como The Bathtub Curve (Curva da banheira), demonstra a curva de falhas por tempo dos hardwares. Ele mostra a vida dos produtos como peças e acessórios eletrônicos após a fabricação até a sua "morte".



1º Estágio - Infant Mortality (Mortalidade Infantil).

No primeiro estágio vemos que a taxa de falhas é muito alta, isto é devido a peças que já saem com problemas de fábrica. Após a troca dessas peças defeituosas, a taxa se estabiliza (segundo estágio).

2º Estágio - Useful Life (Vida Útil).

No segundo estágio, após a troca de peças defeituosas detectadas precocemente (Burn-in), a taxa de falhas cai se torna estável por um tempo (é a vida útil do produto). Como o produto é físico (ao contrário do software), com o tempo ele começa a sofrer desgastes (terceiro estágio).

3º Estágio - Wear-out (Desgaste).

No terceiro estágio a taxa de falhas sobe muito devido ao desgaste sofrido com o uso do equipamento, poeira, vibração, corrosão, etc. Isto é a "morte" do produto ocasionando a troca ou reparo do equipamento.


Lembrando pessoal que usei a Curva da Banheira para compararmos com a Curva do Software que é uma evolução da anterior.

2. Software não se “desgasta”.


Como sabemos os softwares não são componentes físicos como os hardwares, e sim componentes lógicos, logo a curva sofrerá uma alteração.

No início vemos a taxa de falhas muito alta. Isto se deve ao fato de implantação do software, que inicialmente possui muitos erros. A medida que os erros são reparados (Debug), a taxa vai ficando estável.

Quando o software caminha para índices baixos de erro, o software necessita de uma manutenção ou atualização, e novamente a taxa de erros sobe. Isso acontece porque quando ocorre uma alteração no código, a probabilidade de se fazer algo errado e criar um novo erro é muito alta. Isso acontece diversas vezes na construção, implantação de um software e faz com que a taxa de falhas comece a subir novamente, devido a essas alterações.

O que acontece é que o sotware não é como o hardware, não se desgasta e sim começa a ficar obsoleto (Obsolescence). Veja figura abaixo.



3. A maioria dos softwares é feita sob medida em vez de ser montada a partir de componentes existentes.

Ao contrário do hardware que se uma peça der defeito, logo podemos trocá-la e resolver o problema, no software não podemos simplesmente trocar alguma parte do programa por outra nova. Daí a dificuldade de se construir softwares.

Componentes dos Softwares:

Componentes executáveis: instruções de programas, estruturas de dados (bancos de dados), interfaces.

Componentes não executáveis: documentação de projeto e análise, manual de usuário e de produção.

OBS:
Para que um software seja considerado completo, ele deve possuir todos esses componentes.

Aplicações dos Softwares:

Software Básico: Uma coleção de programas escritos para servir a outros programas. Ex: compiladores, editores, sistemas operacionais, drivers etc.

Software de Tempo Real: Programas que monitoram, analisam e controlam eventos do mundo real. Um sistema de tempo real precisa responder dentro de restrições de tempo especificadas, requerendo um bom tempo de resposta. Ex: software de controle de metrô, de usina nuclear, de satélites etc.

Software Comercial: A maior área de desenvolvimento de software. Sistemas de Informação: controle escolar, controle de estoque, sistema de biblioteca, comércio eletrônico, pontos de venda etc.

Software Científico e de Engenharia: Software para apoio a cálculos matemáticos, físicos e atividades de engenharia. Ex: simulação de sistemas, ferramentas CASE (computer-aided software engineering), ferramentas CAD (computer-aided design) etc.

Software Embutido: Normalmente residem em memória não volátil (ROM) e são usados para controle de produtos e sistemas para o mercado consumidor industrial. Ex: programas em forno de microondas, celulares, computadores de bordo em automóveis etc.

Software de Computador Pessoal ou Aplicativo: Softwares de escritório, para computadores pessoais. Ex: editores de texto, planilhas eletrônicas, software de acesso a e-mails etc.

Software de Inteligência Artificial: Adquirem conhecimento com a entrada de dados e informações coletadas anteriormente. Ex: (reconhecimento de voz, de imagem, digital, retina), (jogos inteligentes, gerenciamento de informações imprecisas), notícias, mala direta, etc.

Essa classificação dos software foi baseada na classificação feita por PRESSMAN.

Como abrir e executar programas no Delphi


ShellExecute

Estou postando como abrir e executar programas de dentro de sua aplicação Delphi. Espero que gostem.

Para abrirmos ou executarmos uma aplicação no ambiente Win32 nós iremos utilizar a função ShellExecute da API do Windows.

Dê uma olhada no help do ShellExecute para a descrição de todos os parâmetros e códigos de erro retornado.

Como você verá nós podemos abrir vários tipos de documentos a partir de nossa aplicação sem saber que programa está associado a ele (seu link é definido no registro do Windows)


Exemplos:

Você terá que adicionar a ShellAPI a sua unit.

uses ShellApi;


Executar o Notepad

ShellExecute(Handle, 'open', 'c:\Windows\notepad.exe', nil, nil, SW_SHOWNORMAL) ;


Abrir Abc.txt com o Notepad

ShellExecute(Handle,'open', 'c:\windows\notepad.exe','c:\Abc.txt', nil, SW_SHOWNORMAL) ;


Mostrar o conteúdo da pasta "Delphi"

ShellExecute(Handle,'open', 'c:\Delphi', nil, nil, SW_SHOWNORMAL) ;


Executar um arquivo de acordo com sua extensão.

ShellExecute(Handle, 'open', 'c:\MyDocuments\Letter.doc',nil,nil,SW_SHOWNORMAL) ;


Abrir um Site ou um arquivo html com o navegador padrão

ShellExecute(Handle, 'open', 'http://duvidasdeprogramacao.blogspot.com',nil,nil, SW_SHOWNORMAL) ;


Fonte: http://delphi.about.com/od/windowsshellapi/a/executeprogram.htm

CSS - Background


Ótimos exemplos da propriedade background do CSS.

Nestes exemplos retirados da W3C, após clicar no link você pode editar o código CSS e ver o que acontece no mesmo momento.

Exemplos:

Set the background color
This example demonstrates how to set the background color for an element.

Set an image as the background
This example demonstrates how to set an image as the background.

How to repeat a background image
This example demonstrates how to repeat a background image.

How to repeat a background image only vertically
This example demonstrates how to repeat a background image only vertically.


How to repeat a background image only horizontally

This example demonstrates how to repeat a background image only horizontally.

How to display a background image only one time
This example demonstrates how to display a background image only one time

How to place the background image
This example demonstrates how to place the image on the page.

How to position a background image using %
This example demonstrates how to position an image on the page using percent.

How to position a background image using pixels
This example demonstrates how to position an image on the page using pixels.

How to set a fixed background image
This example demonstrates how to set a fixed background image. The image will not scroll with the rest of the page.

All the background properties in one declaration
This example demonstrates how to use the shorthand property for setting all of the background properties in one declaration.

Retirado de: http://www.w3schools.com/css/css_background.asp

quinta-feira, 12 de março de 2009

Introdução ao CSS


Cascading Style Sheets

Com o CSS, seus documentos HTML podem ser exibidos usando diferentes estilos.

CSS resolve um problema muito comum

As tags HTML foram originalmente projetadas para definir o conteúdo de um documento. Elas foram criadas com a intenção de dizer "Isto é um cabeçalho", "Isto é um parágrafo", "Isto é uma tabela", utilizando tags como <h1>, <p>, <table>, e por daí por diante.
O layout do documento foi criado para ser manipulado pelo browser, sem a utilização das tags de formatação.

As tags de formatação não foram criadas na especificação original do HTML. Isso tornou cada vez mais difícil a criação de web sites, onde o conteúdo dos documentos HTML tivesse que ser separado do layout do documento. Para resolver esse problema, o World Wide Web Consortium (W3C) - Um consórcio sem fins lucrativos, responsável pela padronização do HTML criou o Cascading Style Sheets (CSS).

Hoje o CSS já é suportado pela maioria dos browsers existentes.


As folhas de estilo podem poupar muito trabalho

As folhas de estilo definem como elementos HTML são mostrados.
Exemplo: Tag <font>, <center>, <i>, etc...
Geralmente elas são gravadas em um arquivo externo ".css". Arquivos .css externos habilitam você a mudar a aparência e layout de várias páginas, apenas editando um único arquivo ".css".

CSS é um grande avanço do sites Web, porque permite desenvolvedores controlar o estilo e o layout de muitas Web pages simultaneamente.
Como um desenvolvedor web você pode definir um estilo para cada elemento HTML e aplicá-lo a tantas páginas quanto você quiser.

Para fazer mudanças globais, simplesmente mude o arquivo ".css", e todos elementos nas páginas Web atualizarão automaticamente.

Folhas de Estilo permitem o estilo da informação ser especificada de muitas maneiras.
Estilos podem ser especificados dentro de um simples elemento HTML, dentro da tag <head>, ou em um arquivo externo ".css".
Mesmo múltilpas folhas de estilo externas podem ser referenciadas dentro de um simples documento HTML.

--------------------------------------------------------------------------------

Sintaxe CSS
A sintaxe CSS é dividida em três partes: seletor, propriedade e valor:

seletor {propriedade: valor}

O seletor é normalmente a tag HTML que você quer definir, a propriedade é o atributo que você deseja alterar, e cada propriedade pode ter um valor.

A propriedade e o valor são separados por ":" e devem estar entre chaves:

Exemplo:

body {color: black}


Obs: Se o valor possuir várias palavras, coloque entre aspas:


p {font-family: "sans serif"}


Obs: Se você deseja especificar mais de uma propriedade, você deve separá-las com ";".

O exemplo abaixo mostra como definir um parágrafo alinhado ao centro, com a cor do texto em vermelho:


p {text-align:center;color:red}


Para ficar mais fácil a leitura, você pode descrever uma propriedade em cada linha:


p
{
text-align: center;
color: black;
font-family: arial
}



Fonte: http://www.w3schools.com/css/

Conexões TCP/IP com PostgreSQL 8.3

Pessoal, quando queremos utilizar o banco de dados como um servidor para ser conectado por outras pessoas da rede, precisamos mudar algumas configurações que por padrão vem desativadas por questões de segurança.
Por isso traduzi um post sobre o assunto e vou publicá-lo aqui.

Siga os passos a seguir:


1.-Editar o arquivo postgresql.conf para aceitar conexões TCP/IP.

a) Botão Iniciar –> PostgreSQL 8.3 –> Configuration files –> Edit postgresql.conf



b) No arquivo postgresql.conf buscamos a linha:

# - Connection Settings -

Retire a tralha(jogo da velha) da linha abaixo:

#listen_addresses = ‘localhost’

Substituiremos localhost por *(asterisco), para que o postgresql possa receber conexões, ficando da seguinte forma:

listen_addresses = ‘*’



Salve o arquivo e feche-o. Agora vamos configurar para receber conexões Ip de outras máquinas.

Para dar autorização aos usuários através de conexão remota:

a) Botão Iniciar –> PostgreSQL 8.3 –> Configuration files –> Edit pg_hba.conf



b) No arquivo pg_hba.conf

Buscamos a linha:

# IPv4 local connections:


———-

# TYPE DATABASE USER CIDR-ADDRESS METHOD

# IPv4 local connections:
host all all 127.0.0.1/32 md5

———–

Adicionaremos os IPs dos usuários que se conectarão ao servidor, ficando da seguinte forma:

———-

# TYPE DATABASE USER CIDR-ADDRESS METHOD

# IPv4 local connections:
host all all 127.0.0.1/32 md5
host all all 192.168.0.3/32 md5

———–

O último passo agora é reiniciar o serviço do PostgreSql no servidor para que as alterações tenham efeito e os clientes possam se conectar.

*Fazemos isto no Painel de controle-> Ferramentas Administrativas –> Serviços-> PostgreSQL Database Server 8.3



Paramos o servidor e iniciamos novamente

Assim o cliente poderá se conectar através de seu pgAdmin III

*Obs: Se estiver com firewall, desative-o ou coloque exceções ao postgreSQL.

Material retirado de: http://darkchicles.wordpress.com/2009/02/18/conexiones-tcpip-con-postgresql-83/

quarta-feira, 11 de março de 2009

Javascript: Operadores


Operadores para efetuar mudança do conteúdo de uma variável

= Atribui valor a uma variável
++ Incrementa valor de uma variável, x++ é o mesmo que x=x+1
-- Decrementa valor de uma variável, x-- é o mesmo que x=x-1


Operadores para comparação de valores

== Igual
!= Diferente
=== Estritamente igual(verifica conteúdo e tipo da variável)
!== Estritamente diferente(verifica conteúdo e tipo da variável)
< Menor que
<= Menor ou igual a
> Maior que
>= Maior ou igual a


Operadores aritiméticos

% Módulo
+ Soma
- Subtração
* Multiplicação
/ Divisão


Operadores lógicos

&& Módulo
|| Ou
! Não


Operadores de bits

& Operação E
| Operação Ou
^ Operação Ou Exclusivo
~ Operação Não
>> Rotação de bits para direita
<< Rotação de bits para esquerda
>>> Rotação de bits para direita sem levar em consideração o sinal


Operadores especiais

?: Efetua operação condicionada, exemplo x = a > 1 ? 3 : 4; ou seja se o valor da variável a for maior que 1, será atribuído a x o valor 3 caso contrario 4

, A vírgula efetua operação da esquerda para a direita sendo que o último elemento é retornado. Ex: x=1, y=2;

delete variavel Elimina um objeto que esteja sendo referenciada pela variável, se a variavel for uma propriedade de um objeto, limpa esta referência do objeto.

propriedade in objeto Retorna true caso a propriedade esteja contida no objeto

objeto instanceof TipoDoObjeto Retorna true caso o objeto seja de determinado tipo

typeof(objeto) Retorna string contendo o tipo do objeto

new TipoDoObjeto(p1, ...) Cria uma instância do objeto

this Representa a instância do objeto corrente

void (expressao) Resolve expressão, porém ignora valor retornado



Short Circuit
Operações lógicas utilizam short circuit da seguinte forma :


true || qualquer coisa = true
false && qualquer coisa = false


assim é possível por exemplo fazer a seguinte operação:


if (a != 0 && 1/a > 0.5) {
....
}


assim evita erros de divisão por zero.

Outro exemplo da utilização, é para contornar a diferença dos eventos do explorer e do mozilla/firefox.


function listener(event) {
event = event || window.event;
...
}


Assim se esta função estiver rodando no IE ou num navegador utilizando Gecko irá rodar da mesma forma.

Retirado de Wikibooks

Funções úteis para PostgreSql


Funções Diversas

SELECT CURRENT_DATABASE();

SELECT CURRENT_SCHEMA();

SELECT CURRENT_SCHEMA(boolean);

SELECT CURRENT_USER;

SELECT SESSION_USER;

SELECT VERSION();


SELECT CURRENT_SETTING('DATESTYLE');

SELECT HAS_TABLE_PRIVILEGE('usuario','tabela','privilegio');

SELECT HAS_TABLE_PRIVILEGE('postgres','nulos','insert'); - - Retorna: t

SELECT HAS_DATABASE_PRIVILEGE('postgres','testes','create'); - - Retorna: t

SELECT HAS_SCHEMA_PRIVILEGE('postgres','public','create'); - - Retorna: t


SELECT relname FROM pg_class WHERE pg_table_is_visible(oid);


Arrays

SELECT ARRAY[1.1,2.2,3.3]::INT[] = ARRAY[1,2,3];

SELECT ARRAY[1,2,3] = ARRAY[1,2,8];

SELECT ARRAY[1,3,5] || ARRAY[2,4,6];

SELECT 0 || ARRAY[2,4,6];


Array de char com 48 posições e cada uma com 2:

campo char(2) [48]


Funções Geométricas

area(objeto) - - area(box '((0,0), (1,1))');

center(objeto) - - center(box '((0,0), (1,2))');

diameter(circulo double) - - diameter(circle '((0,0), 2.0)');

height(box) - - height(box '((0,0), (1,1))');

length(objeto) - - length(path '((-1,0), (1,0))');

radius(circle) - - radius(circle '((0,0), 2.0)');

width(box) - - width(box '((0,0), (1,1))');


Funções para Redes

Funções cidr e inet

host(inet) - - host('192.168.1.5/24') - - 192.168.1.5

masklen(inet) - - masklen('192.168.1.5/24') - - 24

netmask(inet) - - netmask('192.168.1.5/24') - - 255.255.255.0

network(inet) - - network('192.168.1.5/24') - - 192.168.1.0/24


Função macaddr

trunt(macaddr) - - trunc(maraddr '12:34:34:56:78:90:ab') - - 12:34:56:00:00:00


Funções de Informação do Sistema

current_database()

current_schema()

current_schemas(boolean)

current_user()

inet_client_addr()

inet_client_port()

inet_server_addr()

inet_server_port()

pg_postmaster_start_time()

version()

has_table_privilege(user, table, privilege) - dá privilégio ao user na tabela

has_table_privilege(table, privilege) - dá privilégio ao usuário atual na tabela

has_database_privilege(user, database, privilege) - dá privilégio ao user no banco

has_function_privilege(user, function, privilege) - dá privilégio ao user na função

has_language_privilege(user, language, privilege) - dá privilégio ao user na linguagem

has_schema_privilege(user, schema, privilege) - dá privilégio ao user no esquema

has_tablespace_privilege(user, tablespace, privilege) - dá privilégio ao user no tablespace


current_setting(nome) - valor atual da configuração

set_config(nome, novovalor, is_local) - seta parâmetro de retorna novo valor

pg_start_backup(label text)

pg_stop_backup()

pg_column_size(qualquer)

pg_tablespace_size(nome)

pg_database_size(nome)

pg_relation_size(nome)

pg_total_relation_size(nome)

pg_size_pretty(bigint)

pg_ls_dir(diretorio)

pg_read_file(arquivo text, offset bigint, tamanho bigint)

pg_stat_file(arquivo text)

Retirado do site: http://pt.wikibooks.org/wiki/PostgreSQL_Pr%C3%A1tico/Fun%C3%A7%C3%B5es_Internas/Convers%C3%A3o_de_Tipos

terça-feira, 10 de março de 2009

Introdução a Engenharia de Softwares - Parte 3 - Automatizar ou não?



Tem outros pontos que acho importante ressaltar na Engenharia de Softwares. Por isso sempre que lembrar de algum detalhe que ache importante vou publicar aqui, porque por mais que sejam muito simples pra nós que somos dá área, pode ser útil as pessoas que estão ingressando.

Automatizar ou não?

Qual é o Analista que nunca se deparou com a situação de dizer a um cliente que não será viável o que ele quer?

Ou será que nenhum de vocês já ouviu. O software vai ter que ficar pra depois, temos que aguardar recursos.

Ou será que você se deparou com aquele velho amigo seu, dono de um boteco que vende muita cerveja e que vive dizendo que quer informatizar o bar, pra melhor controle das contas, clientes, vendas. Você explica a ele que se ele quiser informatizar seu bar terá que comprar um computador, um ar-condicionado, porque o ambiente é quente e pode superaquecer seu processador. De repente terá que comprar também uma impressora fiscal pra emitir os cupons e contratar um técnico para fazer a manutenção do computador já que ele não sabe mexer em nada. Não esquecendo que ele terá que pagar pelo software que você vao fazer que não deve ser nada barato.

Bom depois disso, acho que por mais que eu o explicasse os benefícios que um software bem planejado traria a médio e longo prazo, acho que talvez não seria viável para ele naquele momento. De uma forma bem sucinta o que nós fizemos foi um estudo de viabilidade que nem sempre é feito pelos empresários, causando na maioria das vezes a parada do desenvolvimento de software que é sempre o que os empresários mais conservadores pensam que deve ficar em último plano.

Por essas e outras razões existem vários problemas que devem ser observados antes de começarmos a automatizar um processo. Vou citar os mais comuns para que vocês reflitam a respeito lembrando do exemplo do boteco do seu amigo.

Custo – Nem sempre é verdade que os computadores sejam mais rápidos e mais baratos do que o modo “antigo”.

As vezes o custo benefício não compensa como foi no caso do boteco.

Conforto – Espaço em demasia, excessivo ruído, gerar muito calor ou consumir energia demais.

Como no boteco de repente só o computador com o ar-condicionado iria consumir tanta energia que não compensaria.
Poderia não existir espaço para o computador.


Segurança – dados confidenciais podem ficar vulneráveis.

As vezes o dono fica com um certo medo de te passar informações confidenciais mas imprescindíveis para o desenvolvimento do sistema.

Manutenibilidade – pode não existir pessoal capacitado.

No caso do boteco o dono não teria condições de pagar um técnico para operar o software e fazer manutenção no computador.

Política – os computadores podem ser uma ameaça aos funcionários.

Os funcionários podem te atrapalhar na implantação e outras ocasiões por achar que perderão seus empregos para os computadores.


Pessaol, então é isso ai... Espero que tenha ajudado.

Se interessar estou colocando um link interessante sobre o assunto:
http://www.hitecnet.com.br/prospectos/31/pqdevo1.htm

Introdução a Engenharia de Softwares - Parte 2


Continuando o post anterior que expliquei uma diferença básica mas que confunde muita gente. Software X Sistema

Vamos tirar outras dúvidas que são básicas mas que muita gente não sabe.

Por que dizemos Engenharia de Softwares e não Engenharia de Sistemas?

E Por que dizemos Analista de Sistemas e não Analista de Softwares?

De acordo com a diferença mostrada pode-se concluir que Engenharia de sistemas trata da organização dos sistemas. Como funcionam, como são os processos em um ramo qualquer de atividade. Lembrando que sistemas não são programas de computador.

Quando falamos em Engenharia de softwares estamos nos referindo na construção, projeto, validação, testes e outras coisas relacionadas a programas de computador.

Um Engenheiro de Sistemas é capaz de conhecer como modelar sistemas e processos de um fábrica por exemplo. Já um Engenheiro de Software será capaz de modelar um software para atender as necessidades do Engenheiro de sistemas.

Já quando falamos de Analista de Sistemas e Analista de Softwares é um pouco diferente. O Analista de Sistemas tem a função de entender como funciona um sistema para que ele possa modelá-lo, projetá-lo e construir um software que atenda essas necessidades. Seria quase a junção de um Engenheiro de Sistemas com um Engenheiro de Software.

O Analista de Softwares tem a função de fazer auditoria no software, avaliar, ver as funcionalidades, etc. Em resumo é um estudo do software pronto.

quarta-feira, 4 de março de 2009

Introdução a Engenharia de Softwares - Parte 1


Introdução a Engenharia de Softwares

SOFTWARE X SISTEMA

Sistema

Segundo o WIKIPÉDIA, a palavra "sistema" vem do grego e significa "combinar", "ajustar",
"formar um conjunto". Ou seja, muito genérica a explicação.

Na verdade, em resumo, um sistema é uma ligação entre componentes comuns, com objetivos comuns.

Esses componentes também podem ser sub-sistemas.

Os sistemas tem características em comum:

Eles sempre podem ser divididos em sistemas menores.

Eles sempre farão parte de um sistema maior.


De acordo com essa definição, tudo o que está a nossa volta pode ser encarado como um sistema. Vamos pegar como exemplo o corpo humano.

Quando respiramos utilizamos o sistema respiratório.

Quando comemos utilizamos o sistema digestivo.

Temos o sistema cardíaco, nervoso, etc. Esses sistemas possuem componentes que funcionam com um objetivo em comum. Por exemplo:

O sistema digestivo tem a função de retirar os nutrientes dos alimentos necessários a diferentes funções. E cada órgão terá uma função diferente, mas que no final o objetivo do conjunto é o mesmo.

Exemplos:

Sistemas Feitos pelo Homem:

Sistemas Sociais: organizações de leis, doutrinas, costumes...
Sistemas de Transporte: redes ferroviárias, linhas aéreas...
Sistemas de Comunicação: telefone, telex...
Sistemas Financeiros: contabilidade, controle de estoque...

Sistemas Automatizados:

“São sistemas feitos pelo homem, que interagem com, ou são controlados por um ou mais computadores.”

Sistemas Automatizados:

Componentes:
Hardware – Dispositivos eletrônicos (CPU, memória) que fornecem capacidade ao computador, e dispositivos eletromecânicos (sensores, impressoras, motores) que oferecem funções ao mundo externo.

Software – Programas de computador, estruturas de dados e documentação correlata que servem para efetivar o método, processo ou controle lógico necessário.

Peopleware – Aquelas que operam o sistema, que fornecem as entradas e utilizam as saídas, e as que desempenham atividades de processamento manual em um sistema.

Dataware – As informações que o sistema armazena por um período de tempo.

Procedimentos – Os passos que definem o uso específico de cada elemento do sistema.


Muitos sistemas feitos pelo homem interagem com os sistemas vivos - por exemplo, os marca-passos computadorizados que interagem com o coração humano.

Bom, mas isso está virando uma aula de Biologia? Não é isso que queremos. Estou apenas conceituando Sistema.

Mas e na Informática, o que seria um sistema?

Como na vida real podemos ter um sistema financeiro, sistema escolar, político, etc.

E como funciona?

De acordo com o conceito passado anteriormente esses sistemas possuem componentes que possuem os mesmos objetivos.

Em um sistema de comércio cada componente trabalhará realizando sua função, mas que no final todos terão o mesmo objetivo.

Um sistema comercial pode ser divido em outros sistemas menores como Vendas, Compras, Estoque, etc, comprovando as características citadas.

Mas aí surge a pergunta: Mas onde está a informática nessa história?

Agora que vamos entrar no software

O Software entra em um sistema para auxiliar, agilizar um processo por vários motivos. Aumentar velocidade, diminuir custos, otimizar recursos, etc.

Os softwares nada mais são do que programas de computador, junto com manuais, especificações, planos de teste, etc.

Então está claro a diferença? Software X Sistema

Em um sistema podemos ter vários softwares ou não ter nenhum.

Então por que Engenharia de Softwares e não Sistemas?

Por que da formação Analista de Sistemas e não Softwares?

Assunto para o próximo post. http://duvidasdeprogramacao.blogspot.com/2009/03/introducao-engenharia-de-softwares_10.html

Espero que tenham gostado.

Links

Related Posts with Thumbnails