Seu AntiVirus funciona mesmo?

janeiro 11, 2010 by Lincoln César · Leave a Comment
Filed under: Dicas, Programação 

Voce tem instalado um antivírus em seu computador, mais você tem certeza que esse seu antivírus está mesmo protegendo o seu computador? aqui vai uma dica interessante que você pode testar seu antivírus apenas com um código. Pois vale lembrar se você colocar esse código e o antivírus não apitar… Esta na hora de voce deve migrar de antivírus ou atualiza-lo. Este código não é  vírus ou algo semelhante,  apenas o antivírus reconhece como vírus

Para testar seu antivirus abre o bloco de notas e cole o seguinte código,sem as aspas.

“X5O!P%@AP[4P\ZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*”

Depois va em “Arquivo/Salvar” escolha um local para salvar (de preferencia na área de trabalho) e salve com o nome “testevirus.com” (sem aspas), Pode ser qualquer nome mais terá que ter no final “.com” e clique em salvar. Feito isso logo o antivírus vai apitar!. Se isso nao aconteceu vá até o local onde você salvo, la vai está o ícone do “testevirus.com” de dois cliques, se mesmo assim o antivírus não tiver apitado, faz o que aconselhei acima.

Fonte: dica.info

Resolvendo a incompatibilidade do IE8 com antivirus

janeiro 2, 2010 by Lincoln César · Leave a Comment
Filed under: Programação 

Lançada oficialmente há pouco mais de três meses, a versão final do Internet Explorer 8, conhecida por IE8, chegou prometendo, entre suas inovações, o reforço da segurança. O novo browser da Microsoft veio com uma série de ferramentas para proteger seus usuários contra ameaças online. Entretanto, alguns internautas reclamam que o navegador desabilita programas de antivírus.

Essa foi uma das grande dúvidas de leitores que enfrentaram problema após a instalação do IE8. Um deles informou que o navegador desliga o Norton Internet Security quando abre páginas na internet. A reportagem do WNews entrou em contato com especialistas da Microsoft no Brasil em busca de uma resposta.

Segundo a empresa microsoft, “é natural que o navegador e o antivírus tenham interações já que a internet é a porta de entrada de muitos tipos de malware”. Porém, afirma que uma avaliação mais detalhada desse problema é preciso mais informações sobre as configurações do usuário.

Apesar disso, a Microsoft admite que o novo navegador pode desabilitar o antiphishing do Norton ou vice-versa. Para evitar que isso aconteça, recomenda que o usuário verifique se antivírus que está instalado em sua máquina está atualizado e rodando a última versão do programa de segurança.

A Microsoft ressalta que as versões 2009, 360 2.0 e 3.0 do Norton são compatíveis com o IE8, conforme informa a Symantec em seu site.

Outro argumento que Microsoft deu é que o IE8 por ser um navegador que tem novas ferramantas de segurança se encarrega de fazer a função de antiphishing (Clicar em “Segurança” / Opção “filtro do SmartScreen”).

Mas como o antivírus também vem com essa função, a Microsoft volta a lembrar que pode haver conflito entre os dois programas. Além de verificar se a ferramenta de segurança está atualizada, a produtora do IE8 aconselha que o usuário entre em contato com o fabricante do antivírus para verificar a compatibilidade entre ambos.

Enquanto o problema não for solucionado, a Microsoft orienta o usuário a adotar apenas uma das ferramentas antiphishing desabilitando a outra”.
entao para nao entrar em conflito desabilite uma das ferramentas antiphishing deixando apenas uma ativa.

Fonte: WNews

Conheça a bibliteca JavaScript jQuery

outubro 21, 2009 by caramelosoares · 1 Comment
Filed under: JavaScript/Ajax, Programação 

jQuery Logo

As apps da web 2.0 são uma doce verdade, isso tudo graças à uma metodologia chamada Ajax(Asynchronous Javascript And XML). O Ajax ficou famoso após o lançamento do Gmail em 2004, muitos acham que o Gmail é o começo do plano de conspiração do Google, mas isso é outra história.

O Ajax trouxe muitas vantagens aos internautas, antigamente quando clicava-se em um link, uma nova página era aberta, e todas as imagens e menus anteriores eram carregados inumeras  vezes, com o Ajax é diferete, apenas partes especifícas são recarregados.

Essa mania pegou rapidamente, pois a agilidade que isso tras ao programador é imensa, o problema é que existem muitos navegadores, e o JavaScript se comporta de varias maneiras, tudo isso pelo fato de que o programador tem que criar um objeto XMLHTTP Request para o IE, Firefox, Safari, Chrome e outros.

Nesse ponto, surge o jQuery, que se comporta de forma inteligente na maioria dos Navegadores, facilitando ainda mais a vida dos programadores, ou seja, funciona em um, funciona em todos. Para entender um pouco mais sobre o jQuery assista o Vídeo Post feito por Diego Soares que lhe mostrará as funcionalidades básicas do jQuery e como aplicar os códigos em suas aplicações, fique à vontade para comentar este artigo.

Para assistir o vídeo com uma qualidade melhor, acesse http://www.vimeo.com/3165655 ou http://videolog.uol.com.br/video.php?id=410377 ou assista no player abaixo.

Criando um Data Grid com POO e PHP5

agosto 19, 2009 by admin · Leave a Comment
Filed under: PHP, Programação 

Um data grid nada mais é do que a apresentação de dados em forma de tabela (lembra das <table></table>? Algo assim). Cada conjunto de registros é mostrado em uma linha, e o data grid pode ter funcionalidades de ordenação dos dados e opções para sua edição ou exclusão.

Classe Data Grid PHP

Com esta simples classe é possível criar um data grid a partir de um array com os dados que queremos apresentar na tabela. É simples criar e configurar e, com alguns comandos avançados, é possível alterar o seu comportamento para que seja possível implementar as necessidades habituais em uma estrutura desse tipo.

Essa classe foi criada com POO (Programação Orientada a Objetos) e características que estão disponíveis somente a partir do PHP5. Ela pode ser baixada clicando aqui.

Vamos começar a ver como funciona a classe utilizando um exemplo simples e inserindo funcionalidades no decorrer do artigo, para deixar nosso exemplo mais robusto.

Para começar é necessário inserir a classe nos scripts PHP antes de utilizá-la.

//incluimos a classe

require 'DataGrid.php';

Agora temos que criar um Array com os dados que serão apresentados no Data Grid. Será um array associativo, duas dimensões, onde a primeira, o array principal, receberá todos os registros a serem mostrados no data Grid, e na segunda estão cada um dos registros definidos como um array associativo.

Agora construímos o array com um algumas informações, mais adiante veremos como construir esse array através de uma consulta ao banco de dados.

//criamos o array com os dados a serem apresentados no Data Grid

$alunos = array(

array("id" => 1, "nome" => "Pepe Perez", "curso" => "Informática básica", "nivel" => 2),

array("id" => 2, "nome" => "María Suarez", "curso" => "Informática avançada", "nivel" => 1),

array("id" => 3, "nome" => "Roberto Soriano", "curso" => "Sistemas operacionais", "nivel" => 2),

array("id" => 5, "nome" => "Alberto Rodriguez", "curso" => "Inglés técnico", "nivel" => 1),

array("id" => 7, "nome" => "Julia Marcos", "curso" => "Sociologia", "nivel" => 3),

array("id" => 10, "nome" => "Socorro Rozas", "curso" => "Informática básica", "nivel" => 1),

array("id" => 11, "nome" => "Pablo Reñones", "curso" => "Informática básica", "nivel" => 2)

);

Agora, antes de continuarmos com a construção da estrutura, temos que criar alguns estilos CSS para podermos melhorar o aspecto do Data Grid

<style type="text/css">

.linhaI{background-color:#ffffcc;}

.linhaP{background-color:#ffcc99;}

.fdg_sortable {cursor:pointer;text-decoration:underline;color:#00c;}

</style>

Foram criadas três classes CSS, com seus respectivos estilos. As classes “linhaI” (linha ímpar) e “linhaP” (linha par) aplicaram estilo às linhas do Data Grid e a classe “fdg_sortable” é responsável por estilizar os títulos de cada coluna do Data Grid.

Vamos criar o data grid a partir dos dados que temos no array.

//instanciamos o objeto data grid, passando como parâmetro o array anterior

Fete_ViewControl_DataGrid::getInstance($alunos)

//VAMOS LANÇANDO DIVERSOS MÉTODOS SOBRE O OBJETO INSTANCIADO

//atributos gerais para a tabela

->setGridAttributes(array('cellspacing' => '3?, 'cellpadding' => '4?, 'border' => '0?))

//permitimos que hajam características de ordenação

->enableSorting(true)

//fazemos um setup das colunas do data grid, indicando o valor que será mostrado na primeira linha do data grid

->setup(array(

'id' => array('header' => 'ID'),

'nome' => array('header' => 'Nome'),

'curso' => array('header' => 'Curso'),

'nivel' => array('header' => 'Nivel curso')

))

//definimos os estilos para as linhas ímpares

->setRowClass('linhaI')

//definimos os estilos para as linhas pares

->setAlterRowClass('linhasP')

//chamamos o método que construirá o data grid

->render();

Todas as linhas foram comentadas para que o entendimento se torne mais simples.

Agora vejamos como inserir ou apagar coisas do data grid, para personalizá-lo. Faremos algumas coisas como:

  1. Vamos ocultar o “ID” do array associativo, para que não seja mostrado.
  2. No campo de nível do cursos, vamos mostrar o nível com alguns asteriscos usando uma função que converterá os números em uma cadeia de asteriscos.
  3. Vamos coluna no data grid, que aparecerá antes de qualquer outra, para mostrar um contador que indicará a quantidade de registros apresentados.

Destas três coisas, a mais complicada é fazer um modelo para alterar a forma como é mostrado um campo. Para começar, precisaremos de uma função que devolva o dado que se quer mostrar, com o formato desejado.

function nivel_estrelas($num){

$estrelas = "";

for ($i=0; $i<$num; $i++){

$estrelas .= "*";

}

return $estrelas;

}

Utilizaremos essa função para atribuir como “template” para o campo nível de curso.

Vamos agora ao código utilizado para implementar todas as funcionalidades citadas no data grid:

//OCULTAR UM CAMPO NO DATA GRID

//COLOCAR UMA FUNÇÂO PARA MOSTRAR UM CAMPO

//COLOCAR UM CAMPO ANTES DAS COLUNAS DO ARRAY DO DATA GRID

Fete_ViewControl_DataGrid::getInstance($alunos)

->setGridAttributes(array('cellspacing' => '3?, 'cellpadding' => '4?, 'border' => '0?))

->enableSorting(true)

//fazemos com que o campo "id" do array associativo não seja mostrado

->removeColumn('id')

->setup(array(

'nome' => array('header' => 'Nome'),

'curso' => array('header' => 'Curso'),

//utilizamos a função template para mostrar o nivel do curso com umas estrelas

'nivel' => array('header' => 'Nivel curso', 'cellTemplate' => '[[nivel_estrelas:%data%]]')

))

//inserimos uma coluna em todos os registros do data grid(a primeira coluna será esta)

//nesta coluna mostramos um contador de registros

->addColumnBefore('Contador', '%counter%.', 'Num', array('align' => 'right'))

//definimos a partir de que número será iniciado o contador

->setStartingCounter(1)

->setRowClass('linhaI')

->setAlterRowClass('linhaP')

->render();

Novamente as linhas foram comentadas para facilitar o entendimento. Chamo a atenção sobre a linha que faz uso da função anterior como um template para um campo.

'nivel' => array('header' => 'Nivel curso', 'cellTemplate' => '[[nivel_estrelas:%data%]]')

Isto faz com que o campo “nivel”, quando for mostrado em linhas distintas do data grid, chame a função nivel_estrelas(), passando como parâmetro %data%, que é o valor que tem cada um dos registros do array associativo, no campo “nível”.

Por último vamos ver outro exemplo, um pouco mais desenvolvido, para mostrar os dados do mesmo array. Neste caso vamos simplesmente mostrar uma coluna adicional ao final de cada registro do data grid, onde iremos inserir uns links para editar e/ou apagar o registro atual.

//PARA COLOCAR UM BOTÃO PARA EDITAR OU APAGAR
Fete_ViewControl_DataGrid::getInstance($alunos)
->setGridAttributes(array('cellspacing' => '3?, 'cellpadding' => '4?, 'border' => '0?))
->enableSorting(true)
->removeColumn('id')
->setup(array(
'nome' => array('header' => 'Nome'),
'curso' => array('header' => 'Curso'),
'nivel' => array('header' => 'Nivel curso', 'cellTemplate' => '[[nivel_estrelas:%data%]]')
))
->addColumnBefore('Contador', '%counter%.', 'Num', array('align' => 'right'))
//agora mostro um campo depois de cada elelemto, com links para editar ou apagar o registro
//no interior deste campo utilizo $id$ para enviar o valor "id" do array
->addColumnAfter('actions', '<a href="exemplo3.php?editar=$id$">Editar</a> ?
<a href="exemplo3.php?apagar=$id$" onclick="return confirm('Está certo que quer apagar $nome$?')">Apagar</a>', 'Actions', array('align' => 'center'))
->setStartingCounter(1)
->setRowClass('linhaI')
->setAlterRowClass('linhaP')
->render();

Neste exemplo apenas inserimos uma linha de código para fazer uma chamada ao método addColumnAfter(), que serve para inserir uma coluna depois das colunas que formamos com o array.

->addColumnAfter('actions',
'<a href="exemplo3.php?editar=$id$">Editar</a> ? <a
href="exemplo3.php?apagar=$id$" onclick="return confirm('Está certo que
quer apagar $nome$?')">Apagar</a>', 'Actions', array('align'
=> 'center'))

Neste caso simplesmente temos que indicar como parâmetro a addColumnAfter() dois dados: o primeiro para especificar um título para a coluna e o segundo para especificar o seu conteúdo. O conteúdo dessa coluna, neste caso, são os links para editar e apagar, onde são utilizadas urls que enviam os dados por GET, que é o identificador do registro.

Montando o data grid a partir de um banco de dados

Só falta agora falar sobre como extrair os dados de uma base de dados para fazer o array de elementos que será utilizado na montagem do data grid.

No exemplo que acompanha a classe data_grid há um código para extrair a informação do MySQL, como pode ser visto nas linhas abaixo.

$users = array();

$result = mysql_query("SELECT * FROM user", $dbLinkId);

while ($row = mysql_fetch_assoc($result))

{

$users[] = $row;

}

Como se pode ver, primeiro se cria um array e logo se faz um looping pelos resultados da consulta. Cada um dos elementos retornados pela consulta será introduzido no array criado anteriormente e para ele assinalamos o array associativo que nos devolverá mysql_fetch_assoc() desse primeiro array.

Bom, pessoal, espero que esse artigo possa ser útil a vocês. Clique abaixo para poder fazer o download da classe e de um exemplo.

Clique aqui para baixar a classe data grid junto com um exemplo

Fonte: Imasters

Entendendo um pouco a API Google Maps

agosto 19, 2009 by admin · Leave a Comment
Filed under: Google API, Programação 

O Google dispensa comentários com todas as inovações que ele faz. Hoje falaremos um pouco sobre a API do Google Maps. API (Application Programming Interface ou Interface de Programação de Aplicativos) é a forma que temos de nos comunicar com as funções pré-programadas definidas pelo fornecedor, no caso, Google. Esta API permite a criação de mapas com locais definidos, controle de zoom, tipos de mapa, geração de rotas, pesquisa por estabelecimentos, e muitas coisas mais.

Como começar

A primeira coisa que devemos fazer é acessar o link da página inicial da API, ler e aceitar o contrato, digitar a url do site que deseja usar a API e clicar no botão “Gerar chave da API”. (veja a figura 1)

Figura 1: Aceitando o contrato

Após isso, caso ainda não esteja logado com a sua “Google Account”, o Google pedirá para efetuar o login, nesse passo você obterá a chave para usar a API somente na url que digitou o site. Caso queira usar a API em outro site, deverá repetir esse processo para cada site que quiser. (Veja a figura 2)

Figura 2: Chave gerada

Agora que já temos a chave, podemos usar a API no site. O Google disponibiliza alguns exemplos, para trabalhar com JavaScript, Flash, Serviço, etc..
Neste artigo abordaremos o uso da API para JavaScript e para isso devemos adicionar o seguinte script dentro do bloco head do HTML, no local “SUA_CHAVE”, você deve colocar a chave que o Google gerou para o site, veja o campo Your key is na figura 2.

<script src="http://maps.google.com/maps?file=api&amp;v=2&amp;sensor=true&amp;key=SUA_CHAVE" type="text/javascript">
</script>

O código de base para começar o aprendizado está abaixo:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
	<head>
		<title>Aprendendo a Usar a API Google Maps | Paulo Fernandes </title>
		<meta content="text/html; charset=ISO-8859-1" http-equiv="Content-Type"/>
		<script src="http://maps.google.com/maps?file=api&amp;v=2&amp;sensor=true&amp;
                  key=ABQIAAAAAaVFxs6kNq7gWY59qf5XMxSec6s_uUscdbTyPSy8oWl8zYzqFRRanjFebOU60thMmEQQDEPx3A3y5Q"
                  type="text/javascript"></script>
		<script type="text/javascript">
			var map = null;
			var geocoder = null;
			function inicializa() {
				if (GBrowserIsCompatible()) {
					map = new GMap2(document.getElementById("mapa_base"));
					map.setCenter(new GLatLng(-22.9035393, -43.2095869), 13);
					geocoder = new GClientGeocoder();
  			    }
			}
    </script>
	</head>
	<body onload="inicializa()" onunload="GUnload()">
		<div id="mapa_base" style="width: 500px; height: 300px"></div>
	</body>
</html>

Este código não está difícil de entender, explicaremos as partes mais importantes:

  • No onload(), a função inicializa() verifica se o navegador do usuário é compatível com a API Google Maps, caso positivo, o método captura uma div com id igual a “mapa_base” e define o mapa centralizado. O local padrão que escolhi foi a cidade do Rio de Janeiro, que é representada pelas seguintes coordenadas de latitude e longitude -22.9035393, -43.2095869, respectivamente. O número seguinte, 13, representa o zoom no mapa, quanto menor esse número, menor o zoom.
  • No onunload(), a função GUnload() serve para limpar as estruturas internas e liberar a memória.

Para mais informações sobre os métodos, acesse a documentação em português, através deste link. Essa documentação está interessante, e será a base para o artigo.

Exemplos simples

Neste link podemos analisar diversos exemplos do poder desta API.

Para o artigo, colocaremos alguns exemplos interessantes para inserir um mapa personalizado no site.

  • Descobrir qual a latitude e longitude do endereço: Isso é útil quando se pretende definir algum local como default ao entrar no site. Para isso faremos um formulário onde você digita o endereço e o mapa é carregado no endereço e exibe o posicionamento de latitude e longitude. O código JavaScript é esse:
function mostraEndereco(){
                var endereco = document.getElementById("endereco").value;
                if ( geocoder ) {
                        geocoder.getLatLng(endereco,
                                function(point){
                                        if ( !point ) {
                                                alert(endereco + " não encontrado");
                                        } else {
                                                map.setCenter(point, 13);
                                                var marca = new GMarker(point);
                                                map.addOverlay(marca);
                                                marca.openInfoWindowHtml( endereco + "<br />" + point.toString() );
                                        }
                                }
                        );
                } else {
                        alert("GeoCoder não identificado");
                }
}
E no HTML:
<form id="form_mapa" action="#" method="get">
     <input type="text" name="endereco" id="endereco" size="50" value="São Paulo" />
     <input type="button" name="enviar" id="enviar" value="Mostrar Latitude/Longitude" onclick="mostraEndereco()"/>
</form>
  • Definindo um evento: Para definir um evento precisamos utilizar o objeto GEvent. Seguindo a mesma linha do código, definiremos um evento, que será disparado toda vez que o marcador for clicado, fazendo com que a posição geográfica seja exibida. Devemos colocar esse evento na função mostrarEndereco(), pois é nela que definimos o marcador.
     GEvent.addListener(marca, "click", function() {
           marca.openInfoWindowHtml( endereco + "<br />" + point.toString() );
     });
  • Adicionando zoom no mapa: Para adicionar o controle de zoom, devemos adicionar um controle ao mapa, através do método addControl() e a esse controle devemos adicionar o controle do mapa, o mais correto é adicionar isso na função de inicialização: inicializa(), a linha completa que deve ser inserida é esta:
map.addControl( new GSmallMapControl() );
  • Adicionando forma de visualização: Podemos definir um controle para que o usuário possa ver o endereço na forma de mapa, híbrido ou satélite. Para isso devemos seguir a mesma linha de raciocínio para inserir o zoom, que seria adicionar um controle.
map.addControl( new GMapTypeControl() );

Exemplo avançado

Para mostrar algo avançado, que tal traçar a rota do ponto A ao ponto B? Para isso precisaremos que o usuário digite os valores dos pontos A e B. Para traçar a rota, vamos reescrever todo o exemplo, simplificando as configurações.

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <title>Aprendendo a Usar a API Google Maps - Obter Rota | Paulo Fernandes </title>
        <meta content="text/html; charset=ISO-8859-1" http-equiv="Content-Type"/>

    <script
src="http://maps.google.com/maps?file=api&amp;v=2&amp;sensor=true&amp;
key=ABQIAAAAAaVFxs6kNq7gWY59qf5XMxSec6s_uUscdbTyPSy8oWl8zYzqFRRanjFebOU60thMmEQQDEPx3A3y5Q"
type="text/javascript"></script>
        <script type="text/javascript">
            var map = null;
            var geocoder = null;
            var from;
            var to;
            var directionsPanel = null;
            var directions = null;

            function inicializa() {
                if (GBrowserIsCompatible()) {
                    map = new GMap2(document.getElementById("mapa_base"));
                    map.setCenter(new GLatLng(-22.5489433, -46.6388182), 7);
                    geocoder = new GClientGeocoder();
                    map.addControl( new GSmallMapControl() );
                    map.addControl( new GMapTypeControl() );
                    directionsPanel = document.getElementById("route");
                    directions = new GDirections(map, directionsPanel);

                  }
            }

            function gerarRota(){
                from = document.getElementById("partida").value;
                to = document.getElementById("destino").value;
                if ( geocoder ) {
                    geocoder.getLatLng(from,
                        function(point){
                            if ( !point ) {
                                alert(from + " não encontrado");
                            }
                        }
                    );
                    geocoder.getLatLng(to,
                        function(point){
                            if ( !point ) {
                                alert(to + " não encontrado");
                            }
                        }
                    );

                    var string = "from: " + from + " to: "+to;
                    directions.clear();
                    directions.load(string);
                    GEvent.addListener(directions, "error", erroGetRoute);
                } else {
                    alert("GeoCoder não identificado");
                }
            }

            function erroGetRoute(){
                alert("Não foi possivel traçar a rota de: " + from + " para: " + to );
            }

    </script>
    </head>
    <body onload="inicializa()" onunload="GUnload()">
        <form id="form_mapa" action="#" method="get">
            <label for="partida">Partida</label>
            <input type="text" name="partida" id="partida" value="São Paulo" size="50" />
            <br />
            <label for="destino">Destino</label>
            <input type="text" name="destino" id="destino" value="Rio de Janeiro" size="50" />
            <br />
            <input type="button" name="enviar" id="enviar" value="Obter Rota" onclick="gerarRota()"/>
        </form>
        <div id="mapa_base" style="width: 800px; height: 500px;"></div>
        <div id="route" style="width: 300px; height: 500px; position: absolute; right: 0; top: 0;"></div>
    </body>
</html>

Para mostrar a rota, tivemos que criar uma nova div com o id igual à “route”, é neste local que exibiremos o passo a passo da rota traçada. Essa captura do local foi feita nesta linha directionsPanel = document.getElementById(“route”); Para traçar a rota, devemos instanciar o objeto GDirections e informar para ele carregar a rota através do método directions.load(string);

No método load devemos passar os dois endereços escritos por extenso, antes o endereço de partida devemos atribuir from: e antes do endereço de destino to: , ficando a string completa from: São Paulo to: Rio de Janeiro, por exemplo.

Caso algum dos dois endereços não seja encontrado, o código exibirá um alert informando que a rota não pode ser traçada.

Conclusão

Com este artigo pudemos perceber o poder que a API nos dá, ela nos fornece outras diversas possibilidades que podem ser vistas na documentação oficial. O objetivo do artigo foi introduzir os principais conceitos e o que se pode utilizar no site de sua empresa, por exemplo.

Algo que devemos tomar cuidado é na declaração das variáveis, pois o local onde ela é declarada pode fazer com que a API se porte de forma indesejada. Por exemplo, quando declaramos uma marca, se a tivemos declarado fora da função a cada novo endereço, a marca anterior seria perdida, mas repare que a informação de latitude e longitude é perdida, mantendo somente a ultima. Faça o teste, declare a variável fora do método, acredito que achará bem interessante.

Pode ser que exista outra forma de fazer o que demonstramos ou até que o que foi demonstrado esteja errado, mesmo que aparentemente funcionando.

Fonte: Imasters

Frameworks no PHP: O que, quando, por que e qual?

julho 29, 2009 by admin · Leave a Comment
Filed under: PHP, Programação 

PHP é a linguagem de programação mais famosa do mundo por várias razões: flexibilidade, facilidade de uso e vários outros fatores. Mas algumas vezes a programação se torna monótona e/ou repetitiva, e é aí que um framework pode ajudar.

O que é um framework de PHP?

De forma resumida o framework é uma estrutura, uma fundação para você criar a sua aplicação. Em outras palavras o framework te permite o desenvolvimento rápido de aplicações (RAD), o que faz economizar tempo, ajuda a criar aplicações mais sólidas e seguras além de reduzir a quantidade de código repetido. Os frameworks também permitem que os iniciantes criem aplicações mais estáveis garantindo uma boa relação entre o banco de dados e a camada externa de exibição. Isso tudo te permite gastar mais tempo desenvolvendo a aplicação em si do que repetindo os códigos que todas as aplicações têm.

A idéia padrão de trabalho por trás de um framework no PHP está ligada ao modelo MVC (Model View Controller). MVC é uma forma de programação que isola a lógica de negócio (como a aplicação funciona) da camada de exibição (a parte visual). O Model cuida do banco de dados, o View cuida da camada de exibição e o Controller cuida da lógica de negócio. Isso tudo faz com que você trabalhe mais rápido e de forma setorizada.

Por que usar um framework de PHP?

Os desenvolvedores utilizam frameworks por vários motivos, e o maior deles é para agilizar o processo de desenvolvimento. A re-utilização de código em vários projetos vai economizar muito tempo e trabalho? Isso é garantido, pois o framework já traz uma série de módulos pré-configurados (e funcionando) para fazer as mais variadas e comuns tarefas como envio de e-mails, conexão com o banco de dados, sanitização (limpeza) de dados e proteção contra ataques.

Estabilidade é outra grande vantagem dos frameworks. A simplicidade, que é um dos grandes “feitos” do PHP, também é o que possibilita inúmeros erros e falhas pelos principiantes? Nem todo código que funciona necessariamente está correto e bem desenvolvido.

Quando usar um framework de PHP?

Essa é uma dúvida muito comum em todos os níveis de desenvolvimento. Para a maioria dos iniciantes, usar um framework, além de ser mais fácil, vai ser mais estável, então é bom usá-los sempre que possível.

Em contrapartida vários programadores experientes vêem os frameworks como ferramentas usadas por programadores fracos, que não sabem como criar um código limpo, sólido e seguro.

Quando se trabalha com projetos que têm um prazo muito curto (o que eu chamo de “prazo Jack Bauer”) é sempre bom usar um framework, pois ele vai agilizar todo o processo. Outro motivo forte para o uso do framework é que você não está criando “código artesanal”? Há todo um padrão que você deve seguir para que as coisas funcionem, e está tudo documentado e explicado em uma vasta comunidade de suporte.

CakePHP

O CakePHP é uma grande opção para iniciantes e desenvolvedores avançados. Ele foi criado usando as bases e modelos do Ruby on Rails e é pesadamente focado no desenvolvimento ágil e rápido. Recentemente ele tem se tornado muito famoso por sua simplicidade e facilidade de uso.

Eu pessoalmente recomendo o CakePHP. Minha vida de programador mudou depois que eu comecei a usar ele.

Zend Framework

O Zend Framework é um framework focado no desenvolvimento de aplicações pra web 2.0. Ele tem um grande número de seguidores, fontes de suporte e uma comunidade cheia de usuários ativos e participativos. O Zend é o framework mais famoso hoje em dia, ele é robusto e permite a criação de aplicações enterprise (de grande porte) mas seu uso exige um conhecimento vasto do PHP.

CodeIgniter

Já o CodeIgniter é bastante conhecido pela sua facilidade de uso, performance e rapidez. É ideal para aplicações rodando em servidores compartilhados. Ele oferece soluções simples e de pequeno porte, com um grande número de tutoriais em vídeo, fóruns e wikis.

Fonte: Imasters

Conectando C# ao MySQL

julho 29, 2009 by admin · Leave a Comment
Filed under: .Net, Banco de Dados, MySQL, Programação 

Quem está habituado a programar C# normalmente utiliza SQL Server como banco de dados, uma vez que ela está integrada no Visual Studio e, por isso mesmo, existe grande facilidade em trabalhar com as duas ferramentas.

Por vezes existem projetos em que se torna conveniente (por várias razões) utilizar outro tipo de base de dados. Seja que banco de dados for, a sua integração é sempre diferente do SQL Server.

Neste caso vou mostrar como fazer a integração entre o C# e o MySQL.

Supondo que já existe uma instalação do MySQL na máquina, precisamos instalar um intermediário entre o C# e a base de dados. Neste caso necessitamos instalar o MySQL Connector NET.

Download

A versão 5.2 já tem suporte ao Visual Studio 2008, mas eu vou utilizar a última versão (6.0).

Instalamos o Connector Net 6.0.

Devemos já ter uma base de dados com uma tabela (users por exemplo), em que os campos da tabela são: id, nome, email.

Como exemplo criamos um projecto Windows Forms Application.

Antes de mais nada, devemos fazer uma referência à classe que vai ligar o C# ao MySQL. Para isso vamos ao painel Solution Explorer, na raiz do projeto, clicamos com o lado direito do mouse e selecionamos Add Reference.

Na primeira divisória (.NET) selecionamos a referência MySQL.Data e damos OK.

Não esquecer: incluir no início do código as classes:

using System.Data;

using MySql.Data.MySqlClient;

Sem adicionar a referência à MySQL.Data, a classe MySql.Data.MySqlClient não será reconhecida.

Para exemplificar fazemos um formulário de inserção de dados (nome e e-mail) na base de dados.

No form colocamos duas caixas de texto, uma para o nome (txtNome) e outra para o e-mail (txtMail) e um botão que terá a ação de inserir os dados na base de dados.

Vamos então definir, em primeiro lugar, o dataset e a string de conexão à base de dados.

private MySqlConnection bdConn; //MySQL
private MySqlDataAdapter bdAdapter;
private DataSet bdDataSet; //MySQL

Na ação do botão:

//Definição do dataset
bdDataSet = new DataSet();
 //Define string de conexão
bdConn = new MySqlConnection("Persist Security  Info=False;server=localhost;database=rfidapp;uid=root;server=localhost;database=rfidapp;uid=root;pwd=''");

Neste caso a base de dados não tem password.

//Abre conecção
 try{
        bdConn.Open();
}
catch{
 MessageBox.Show("Impossível estabelecer conexão");
}
//Verifica se a conexão está aberta
if (bdConn.State == ConnectionState.Open)
{
        //Se estiver aberta insere os dados na BD
MySqlCommand commS = new MySqlCommand("INSERT INTO regists VALUES('',\\'" + txtNome + "\\',\\'" + txtMail + "\\')", bdConn);
commS.BeginExecuteNonQuery();
}

Tome atenção na sintaxe do SQL para o MySQL (INSERT) que é um pouco diferente do C#/SQL Server.

Neste momento o formulário deverá inserir dados no BD.

Fonte: Imasters

Google Quality Score – conheça o segredo por trás do leilão do Google AdWords

julho 6, 2009 by admin · Leave a Comment
Filed under: Dicas, Google API, Programação, Tecnologia 

Falando sobre o SMX Advanced, resolvi escrever sobre um dos principais temas discutidos em qualquer evento de Search Marketing (SEM) – o Quality Score do Google AdWords. Se você usa o Google AdWords para qualquer campanha de marketing (ou tem uma agência que faz isso por você), conhecer o que está por trás do leilão do Google e como o preço pago por cada clique é determinado é fundamental.

Primeiro, uma breve explicação sobre como se determina a ordem dos anúncios exibidos nas páginas de buscas do Google (se isso é básico demais para você , pule para o próximo parágrafo). O Google sempre está preocupado em balancear três participantes do sistema de buscas – anunciante, usuário e o próprio Google. Nos primeiros sistemas de leilão de posições de anúncios em buscadores, o único critério que determinava a ordem dos anúncios era o lance de cada um. Ficava em primeiro quem fazia a melhor oferta. O problema desse modelo é que o anúncio poderia ser totalmente insignificante para o usuário que fez a busca. A grande inovação do Google foi criar um índice de qualidade para os anúncios, o chamado Quality Score. No Google AdWords, então, além do lance de cada anunciante, a qualidade do anúncio é levada em consideração para decidir a ordem dos anúncios e o preço a ser pago também.

Mas no que consiste o Quality Score? Essa é a resposta que o Google nunca revela, porém o que eles indicam é que são basicamente três fatores, com pesos desproporcionais. O primeiro e mais importante é a taxa de clique ou CTR (click-through rate), o segundo é a relevância do anúncio (aqui diversas variáveis contam, mas todas ligadas à linguagem do anúncio e à palavra buscada) e o terceiro é a página de destino (ou landing page). Da composição destes três fatores é atribuído um Quality Score ao grupo anúncio/palavra-chave.

E como se determina a ordem dos anúncios e o valor a ser pago? A ordem dos anúncios a serem exibidos é determinada pelo Ad Rank (multiplicação do lance pelo Quality Score). Primeiro calcula-se o Ad Rank de cada anúncio e se ordena do maior para o menor.

E, finalmente, o valor a ser pago por cada anunciante: existe uma matemática bem simples por trás desta conta – o preço pago pelo anunciante que ficou em primeiro na ordem dos Ad Ranks é igual ao Ad Rank do segundo colocado (30 no exemplo abaixo), dividido pelo seu Quality Score (8 no exemplo abaixo) e assim por diante. Exemplo:

Dessa forma, o incentivo é para que cada anunciante ofereça o lance máximo que realmente está disposto a pagar, pois ele não será penalizado caso os outros anunciantes estejam oferecendo valores menores, já que o valor real que pagará depende do valor oferecido pelo próximo anunciante. Além disso, um fator muito relevante é que, quanto maior o Quality Score, menor será o preço efetivo pago, portanto, sempre valerá a pena tentar melhorá-lo.

Para  mais detalhes sobre como funciona o leilão do Google AdWords, recomendo este vídeo feito pelo Hal Varian, Chief Economist do Google: http://www.youtube.com/watch?v=K7l0a2PVhPQ.

Vale a pena também assistir o vídeo do presidente da ClickEquations, Craig Danuloff, em uma das palestras durante o SMX Advanced:.   http://www.midiadigital.com.br/blog/sem/google-quality-score-under-a-microscope/.

Créditos para Guilherme Gomide, que filmou e editou essa palestra.

Espero que vocês tenham aproveitado as novidades discutidas no SMX Advanced e trazidas pelo MMOnline. Caso queiram mais informações sobre o evento ou sobre os artigos escritos, fiquem à vontade para me mandarem emails (rgrosman@fbiz.com.br) ou seguirem-me no Twitter (http://twitter.com/rgrosman).

Fonte: Imasters

O que é o Google Wave?

junho 1, 2009 by admin · Leave a Comment
Filed under: Dicas, Google API, Programação 

O que é o Google Wave?

O Google anunciou, na sexta passada, uma ideia nova e experimental para modificar o futuro da comunicação na Web. O nome é Wave (“Onda”) e, se você acreditar no seu desenvolvedor, é “o que o email seria se fosse inventado hoje”. Além disso, vai ser totalmente open source. Já está intrigado?

Primariamente, o Wave tem como objetivo melhorar a comunicação em tempo real na web. Aqui tem um vídeo de quase hora e meia com a apresentação completa aos desenvolvedores na conferência Google I/O, mas se você não quiser ou não tiver tempo de ver, fique com os detalhes diretamente da boca do Google:

O QUE É UMA WAVE?

Uma wave é conversação e documento em partes iguais. As pessoas podem se comunicar e trabalharem juntos com texto formatado, imagens, vídeos, mapas e mais.

Uma wave é compartilhada. Qualquer participante pode responder em qualquer ponto da mensagem, editar o seu conteúdo e adicionar participantes em qualquer ponto do processo. A função Playback permite que qualquer um retroceda a Wave passo a passo desde o início, para ver quem disse o quê e quando.

Uma wave é viva. Com a transmissão instantânea à medida que você digita, os participantes de uma wave podem ter conversações mais rápidas, ver edições e interagir com extensões em tempo real.

Bastante amplo, né? O Google Wave é claramente algo que precisaremos ver em ação, usar mesmo, antes de entender completamente como funciona. Da mesma forma que o email, o Wave foi desenvolvido como um padrão que poderá ser rodado a partir de qualquer servidor, então ele não vai pertencer ao Google. Qualquer um vai poder ter o seu próprio Wave, e este Wave pode competir com o do Google ou se comportar como o dono quiser. Mas, sendo criado sobre um protocolo padrão, Waves diferentes podem entender e se comunicar entre si, da mesma forma que o Outlook pode trocar emails normalmente com um Thunderbird, GMail ou Yahoo Mail.

Isso resolve um problema que eu (e muitos outros bem mais inteligentes que eu) sempre tive com o Twitter: ele vive nos servidores de uma empresa, e a sua informação está suscetível ao que quer que a empresa queira fazer com ela. RSS, email e mensagens instantâneas trabalham com protocolos padrões que podem ser utilizados por qualquer um. É o exemplo dos emails que eu dei acima.

O blog TechCrunch fez uma análise bem detalhada do Wave (link lá no fim, em inglês) e dos rumos que o Google tomou com ele até agora. O Wave ainda é incrivelmente novo e pouco desenvolvido, mas também é muito intrigante sob o ponto de vista do Futuro-da-Internet e coisa assim. Pode não dar em nada, mas considerando as reações que teve e a popularidade de serviços como o Twitter e o Facebook, a ideia de um protocolo que transforma uma comunicação deste tipo em padrão aberto soa muito promissora.

O Wave não está disponível de nenhuma forma para mim e para você por enquanto, e muito da tecnologia por trás dele depende das atualizações do HTML 5, que não estarão disponíveis pelo menos por mais um pouco de tempo, mas no site oficial você pode se inscrever para atualizações do Google Wave se estiver ansioso por toda e qualquer novidade do desenvolvimento. (N.T.: Eu mais do que certamente estou.)

Fonte: Imasters

Acesso básico a dados com LINQ to SQL

maio 14, 2009 by admin · Leave a Comment
Filed under: .Net, Programação 

O desenvolvimento de aplicações para acesso a banco de dados usando a plataforma .NET não sofreu grandes alterações desde o seu lançamento. Geralmente você começa definindo o seu banco de dados, tabelas, relacionamentos, em seguida parte para a definição das classes de forma a procurar representar o domínio do seu negócio e finalmente usa os mesmos conceitos abstratos básicos de programação: definindo objetos Connection, objetos Command, objetos datareader, objetos dataset etc.

Muitos desenvolvedores já têm sua biblioteca de funções prontas ou usam recursos de terceiros ou mesmo da Microsoft, como os Data Application Blocks.

Ficamos tão acostumados como uma forma de escrever código que, muitas vezes, não percebemos que temos novos recursos à disposição, que irão garantir um melhor desempenho e manutenção. Afinal, se está funcionando, é o que importa, pensamos…

A partir da versão 3.0, e consolidada na versão 3.5 da plataforma .NET, temos um leque de novas funcionalidades que nos dão um ganho muito grande de produtividade. Uma delas, o foco deste artigo, é o LINQo SQ tL.

Neste artigo eu vou mostrar como usar os novos recursos do LINQ to SQL para efetuar o mapeamento para tabelas de um banco de dados SQL Server e, em seguida, usar os recursos da linguagem LINQ de forma  ter um código enxuto e eficiente. Bem diferente da forma como estávamos acostumados a fazer.

Vou criar uma aplicação web, mas poderia ser uma aplicação windows forms, e usando a linguagem VB .NET, vou efetuar o mapeamento OR/M para uma tabela Alunos do banco de dados Teste.mdf criado no SQL Server 2005 Express Edition, sem usar o assistente e o descritor objeto Relacional disponível, dessa forma podemos entender um pouco melhor como as coisas funcionam.

Como não é objetivo deste artigo, eu não vou mostrar como criar o banco de dados e a tabela no Visual Web Developer 2008 Express, mas essa é uma tarefa bem simples. Se você tiver dúvidas, consulte as referências para maiores detalhes.

Abaixo temos o banco de dados Teste.mdf e a tabela Alunos definida com os campos: id, nome e email, onde o campo id é uma chave primária do tipo identity;

Logo depois temos a tabela exibindo alguns dados que eu incluí para usar no projeto deste artigo.

O banco de dados será copiado na pasta App_Data.

Em seguida defina o arquivo web.config a string de conexão usada para acessar o banco de dados Teste.mdf:

<connectionStrings>
 <add name="connectionStringAlunos"
connectionString="Data
Source=.\SQLEXPRESS;AttachDbFilename='C:\Documents and
Settings\macoratti\_
   Meus documentos\Visual Studio 2008\Projects\linq_Entities\linq_Entities\App_Data\Teste.mdf';_
   Integrated Security=True;User Instance=True" providerName="System.Data.SqlClient"/>
</connectionStrings>

Observe que temos o nome connectionStringAlunos a string de conexão usada.

Nota: Na sua máquina local a string de conexão pode ser diferente, atente para este detalhe.

No exemplo deste artigo eu vou usar o Visual Web Developer 2008 Express Edition, que já dá suporte ao LINQ to SQL e permite efetuar o mapeamento objeto relacional.

Abra o VWD 2008 e crie um novo web site a partir do menu File-> New web site com o nome de acessoLINQ usando a linguagem VB .NET;

A seguir a partir no menu Web Site -> Add New Item, selecione o template Class e informe o nome LINQ.vb e clique em Add; (o arquivo será copiado na pasta App_Code).

Antes de iniciar, clique com o botão direito do mouse sobre o nome do projeto e selecione Add Reference e, a partir da janela Add Reference, inclua a referência a System.Data.Linq;

Agora vamos criar a classe que vai efetuar o mapeamento OR/M com a tabela Alunos do nosso banco de dados. Veja o código a seguir:

Imports System
Imports System.Data.Linq.Mapping

<Table(name:="Alunos")> _
Public Class aluno

    Private _id As Integer
    Private _nome As String
    Private _email As String

 <Column(IsPrimaryKey:=True, IsDbGenerated:=True)> _
    Public Property Id() As Integer
        Get
            Return _id
        End Get
        Set(ByVal value As Integer)
            _id = value
        End Set
    End Property

    <Column(CanBeNull:=True)> _
    Public Property Nome() As String
        Get
            Return _nome
        End Get
        Set(ByVal value As String)
            _nome = value
        End Set
    End Property

    <Column(CanBeNull:=True)> _
    Public Property Email() As String
        Get
            Return _email
        End Get
        Set(ByVal value As String)
            _email = value
        End Set
    End Property

End Class

Definimos a classe aluno mapeada para a tabela Alunos e definimos três propriedades:

  • Id()
  • Nome()
  • Email()

Cada uma delas sendo mapeada para a coluna correspondente da tabela Alunos;

Com isso já teremos o acesso via entidade criada no mapeamento.

A classe aluno representa a tabela Alunos do banco de dados.

Vamos agora criar a interface na página Default.aspx. Inclua a partir da ToolBox os seguintes componentes nesta página:

  • TextBox – ID=txtNome
  • Button – ID=btnProcurar
  • GridView – ID=gdvAlunos

Defina o seguinte leiaute na página:

Agora vamos definir o código associado ao evento Click do botão Procurar:

 Protected Sub btnProcurar_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnProcurar.Click

  Dim conexao As String = ConfigurationManager.ConnectionStrings("connectionStringAlunos").ConnectionString.ToString
  Dim db As New DataContext(conexao)
  Dim tAlunos As Table(Of aluno)
        tAlunos = db.GetTable(Of aluno)()
        gdvAlunos.DataSource = tAlunos.Where(Function(a) a.Nome.Contains(txtNome.Text))
        gdvAlunos.DataBind()

 End Sub

1. Obtemos a string de conexão a partir do arquivo web.config:

 Dim conexao As String = ConfigurationManager.ConnectionStrings("connectionStringAlunos").ConnectionString.ToString

2. Criamos uma instância da classe DataContext usando a conexão obtida;

Dim db As New DataContext(conexao)

3. Definimos um objeto tAlunos do tipo Table(Of )

     
Dim tAlunos As Table(Of aluno)

4. Obtemos a tabela ALunos a partir do contexto criado através do método GetTable<> que referencia o nome da classe aluno e não nome da tabela;

tAlunos = db.GetTable(Of aluno)()

5. Usamos uma expressão lambda onde selecionamos os nomes contidos na tabela a partir da expressão informada no TextBox txtNome;

tAlunos.Where(Function(a) a.Nome.Contains(txtNome.Text))

Executando o projeto, se nada for informado na caixa de texto, todos os dados da tabela serão exibidos:

Informando um critério qualquer teremos:

Observe que não nos preocupamos em definir objetos connection, commands, datareaders ou datasets apenas instanciamos um contexto a partir do qual tivemos acesso, a partir da classe mapeada para a tabela, aos dados usando uma consulta LINQ.

O código ficou mais enxuto e tivemos menos trabalho. E isso sem usar o assistente; com ele o trabalho de gerar a classe não seria necessário. Devemos portanto conhecer os novos recursos para saber avaliar quando usá-los para obtermos um produto final mais refinado.

Aguarde novos artigos sobre o assunto…

Pegue o projeto completo aqui:  acessoLINQ.zip

Referências:

Fonte: Imasters

Próxima Página »

SEO Powered by Platinum SEO from Techblissonline