<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" version="2.0">

<channel>
	<title>Blog do Marcos</title>
	
	<link>http://marcos.blog.br</link>
	<description>badulaques, gadgets e outros...</description>
	<lastBuildDate>Thu, 26 Nov 2009 02:04:39 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/MarcosBlogBr" /><feedburner:info xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" uri="marcosblogbr" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item>
		<title>JavaScript UTF-8 Decode</title>
		<link>http://marcos.blog.br/2009/11/javascript-utf-8-decode/</link>
		<comments>http://marcos.blog.br/2009/11/javascript-utf-8-decode/#comments</comments>
		<pubDate>Thu, 26 Nov 2009 02:03:16 +0000</pubDate>
		<dc:creator>Marcos</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Dicas]]></category>

		<guid isPermaLink="false">http://marcos.blog.br/?p=165</guid>
		<description><![CDATA[Como o Javascript não possui nenhuma função nativa para decodificar palavras no formato UTF-8, segue uma função que pode ser muito útil por exemplo se você estiver trabalhando com Cookie que não aceita este formato.]]></description>
			<content:encoded><![CDATA[<p>Como o Javascript não possui nenhuma função nativa para decodificar string no formato UTF-8, segue uma função que pode ser muito útil por exemplo se você estiver trabalhando com Cookie que não aceita este formato.</p>
<pre class="brush: javascript">
function utf8_decode ( str_data ) {
    var tmp_arr = [], i = 0, ac = 0, c1 = 0, c2 = 0, c3 = 0;
    str_data += &#039;&#039;;
    while ( i &amp;lt; str_data.length ) {
        c1 = str_data.charCodeAt(i);
        if (c1 &amp;lt; 128) {
            tmp_arr[ac++] = String.fromCharCode(c1);
            i++;
        } else if ((c1 &amp;gt; 191) &amp;amp;amp;&amp;amp;amp; (c1 &amp;lt; 224)) {
            c2 = str_data.charCodeAt(i+1);
            tmp_arr[ac++] = String.fromCharCode(((c1 &amp;amp;amp; 31) &amp;lt;&amp;lt; 6) | (c2 &amp;amp;amp; 63));
            i += 2;
        } else {
            c2 = str_data.charCodeAt(i+1);
            c3 = str_data.charCodeAt(i+2);
            tmp_arr[ac++] = String.fromCharCode(((c1 &amp;amp;amp; 15) &amp;lt;&amp;lt; 12) | ((c2 &amp;amp;amp; 63) &amp;lt;&amp;lt; 6) | (c3 &amp;amp;amp; 63));
            i += 3;
        }
    }
    return tmp_arr.join(&#039;&#039;);
}
</pre>
<p>Esta função foi feita com base na função utf8_decode do PHP.</p>
<p>Retirado do site: <a  href="http://phpjs.org/functions/utf8_decode:576" target="_blank">PHPJS.org</a></p>
<br/>Visualizações: 268<br/>]]></content:encoded>
			<wfw:commentRss>http://marcos.blog.br/2009/11/javascript-utf-8-decode/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Google planeja tornar a Web duas vezes mais rápida</title>
		<link>http://marcos.blog.br/2009/11/google-planeja-tornar-a-web-duas-vezes-mais-rapida/</link>
		<comments>http://marcos.blog.br/2009/11/google-planeja-tornar-a-web-duas-vezes-mais-rapida/#comments</comments>
		<pubDate>Fri, 13 Nov 2009 14:18:35 +0000</pubDate>
		<dc:creator>Marcos</dc:creator>
				<category><![CDATA[Web]]></category>
		<category><![CDATA[Google Maps]]></category>

		<guid isPermaLink="false">http://marcos.blog.br/?p=152</guid>
		<description><![CDATA[Recentemente em um post no blog oficial do Chrome, seu navegador, o Google revelou que andou realizando testes em um protocolo denominado "SPDY", nome que veio da palavra "Speedy" do inglês. Bem apropriado para a idéia de deixar a Web duas vezes mais rápida.]]></description>
			<content:encoded><![CDATA[<p style="text-align: left;"><img class="size-thumbnail wp-image-155 alignleft" style="margin-top: 0px; margin-bottom: 0px; margin-left: 6px; margin-right: 6px;" title="chromium" src="http://marcos.blog.br/wp-content/uploads/2009/11/chromium-150x150.jpg" alt="chromium" width="150" height="150" />Que o <strong>Google investe milhões em pesquisas</strong> todo mundo sabe. Sempre somos surpreendidos por novidades. No entanto ninguém imagina até onde vai seus limites.</p>
<p>O Google anda fazendo pesquisas a um nível tão avançado, que estuda meios de substituir o protocolo HTTP que hoje é a base da Word Wide Web.</p>
<p>Recentemente em um post no blog oficial do Chrome, seu navegador, o Google revelou que andou realizando testes  em um protocolo denominado &#8220;<strong>SPDY</strong>&#8220;, nome que veio da palavra &#8220;Speedy&#8221; do inglês. Bem apropriado para a ideia de deixar a <strong>Web duas vezes mais rápida</strong>.</p>
<p>O Protocolo HTTP vem alimentando a Web desde 1996, e o tom do post faz referência ao novo SPDY como um protocolo que irá aposentar o velho HTTP. Hoje em dia sabemos que o Google é uma das poucas empresas com cacife suficiente e recursos para estimular a evolução de sites e navegadores com um protocolo novo que visa acelerar a comunicação entre servidores web e clientes.</p>
<p>O Google revelou ainda que já tem um <strong>protótipo de um servidor Web e um cliente Chrome com suporte ao SPDY embutido</strong> e que foram testados em laboratório. Em testes, eles teriam conseguido um <strong>aumento de 55% na velocidade do carregamento da página</strong>.</p>
<p>Confiantes em seu protocolo, o google disponibilizou a <a  href="http://dev.chromium.org/spdy" target="_blank">documentação do SPDY</a>, bem como o <a  href="http://src.chromium.org/viewvc/chrome/trunk/src/net/flip/" target="_blank">código fonte</a> e deseja que a comunidade participe dando o <a  href="http://groups.google.com/group/chromium-discuss/?pli=1" target="_blank">feedback</a> sobre este revolucionário projeto.</p>
<br/>Visualizações: 219<br/>]]></content:encoded>
			<wfw:commentRss>http://marcos.blog.br/2009/11/google-planeja-tornar-a-web-duas-vezes-mais-rapida/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Classe PHP para gerar XML</title>
		<link>http://marcos.blog.br/2009/11/classe-php-para-gerar-xml/</link>
		<comments>http://marcos.blog.br/2009/11/classe-php-para-gerar-xml/#comments</comments>
		<pubDate>Wed, 04 Nov 2009 20:37:36 +0000</pubDate>
		<dc:creator>Marcos</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Sem categoria]]></category>
		<category><![CDATA[XML]]></category>

		<guid isPermaLink="false">http://marcos.blog.br/?p=147</guid>
		<description><![CDATA[Ano passado fiz uma classe simples para gerar arquivos XML a partir de um Array Associativo de um modo mais prático. Fiquei surpreso semana passada com o número de downloads e o feedback positivo que tive ao publica-la no phpclasses.org, por isso vou postar aqui também.
Exemplo de Uso

	header(&#34;Content-type:application/xml; charset=utf-8&#34;);
	$tmp = $this-&#62;Search(&#34;SELECT id, nome FROM usuarios&#34;);

	$objXml [...]]]></description>
			<content:encoded><![CDATA[<p>Ano passado fiz uma classe simples para <strong>gerar arquivos XML a partir de um Array Associativo</strong> de um modo mais prático. Fiquei surpreso semana passada com o número de downloads e o feedback positivo que tive ao publica-la no <a  href="http://phpclasses.org" target="_blank">phpclasses.org</a>, por isso vou postar aqui também.</p>
<h3>Exemplo de Uso</h3>
<pre class="brush: php">
	header(&quot;Content-type:application/xml; charset=utf-8&quot;);
	$tmp = $this-&gt;Search(&quot;SELECT id, nome FROM usuarios&quot;);

	$objXml = new Xml();
	$objXml-&gt;addContent($tmp,&#039;usuarios&#039;);
	echo $objXml-&gt;showXML();
</pre>
<h3>Classe XML.Class.php</h3>
<pre class="brush: php">
	/**
	* Classe responsável por formatar conteúdos em arquivos XMl
	*
	* @author Marcos Timm Rossow &lt;marcos@interwise.com.br&gt;
	* @version 0.1
	* @copyright Interwise
	* @access Public
	* @package ADM
	*/
	class Xml
	{
		/**
		* Variável com o nome do sistema
		* O nome do sistema é o root do documento xml
		* Por padrão define o sistema definido no arquivo de configuração
		* @access Private
		* @name $_root
		*/
		private $_root = &quot;root&quot;;

		/**
		* Variável com o tipo de codificação
		* @access Private
		* @name $_root
		*/
		private $_codificacao = &#039;UTF-8&#039;;

		/**
		* Versão do documento de saída
		* @access Private
		* @name $_versao_xml
		*/
		private $_versao_xml = &#039;1.0&#039;;

		/**
		* Objeto de construção do arquivo XML
		* @access Private
		* @name $_obj_xml
		*/
		private $_obj_xml;

		/**
		* Método construtor.
		* Inicia o objeto e cria o root com o nome do sistema especificado no arquivo de configuração
		* @access Public
		* @param String $_root possibilita definir outro nome ao root do documento diferente do informado no arquivo de configuração do sistema
		* @param String $_codificacao possibilita definir outro tipo de codificação. O padrão é UTF-8
		* @param String $_versao_xml possibilita alterar a versão de saída do arquivo XML. Por padrão, versão 1.0
		* @return bool
		*/
		public function __construct($_root = FALSE, $_codificacao = FALSE, $_versao_xml = FALSE)
		{
			// caso  tenha sido passado um nome para o sistema, define o mesmo
			if(isset($_root) AND &quot;&quot; != $_root)
				$this-&gt;_root = $_root;

			// caso  tenha sido passado a codificação do sistema, define o mesmo
			if(isset($_codificacao) AND &quot;&quot; != $_codificacao)
				$this-&gt;_codificacao = $_codificacao;

			// caso  tenha sido passado versão de saída do arquivo xml, define o mesmo
			if(isset($_versao_xml) AND &quot;&quot; != $_versao_xml)
				$this-&gt;_versao_xml = $_versao_xml;

			// inicia o objeto XmlWriter
			$this-&gt;_obj_xml = new XmlWriter();
			// inicia a memória
			$this-&gt;_obj_xml-&gt;openMemory();
			// inicia o documento passando como parâmetro a versão do documento xml e o tipo de codificação que será usada
			$this-&gt;_obj_xml-&gt;startDocument($this-&gt;_versao_xml, $this-&gt;_codificacao);
			// cria a raiz do documento com o nome do sistema
			$this-&gt;_obj_xml-&gt;startElement($this-&gt;_root);
			// habilita a identação do documento
			$this-&gt;_obj_xml-&gt;setIndent(TRUE);
			// define 3 espaços para serem utilizados como identação afim de ficar mais claro no debug
			$this-&gt;_obj_xml-&gt;setIndentString(&quot;   &quot;);

			return true;
		}

		/**
		* Método para adicionar conteúdo ao XML
		* Inicia o objeto e cria o root com o nome do sistema especificado no arquivo de configuração
		* @access Public
		* @param String $_array_dados Array de forma associativa com dados a serem inseridos no objeto XML
		* @return bool
		*/
		public function addContent($_arr_dados, $_str_indice = FALSE)
		{
			// verifica se foi passado um array válido
			if(is_array($_arr_dados) AND 0 &lt; count($_arr_dados))
			{
				// percorre os elementos do array
				foreach($_arr_dados as $chave =&gt; $valor)
				{
					// verifica se existem filhos para este array
					if(is_array($valor))
					{
						// abre o elemento
						$this-&gt;_obj_xml-&gt;startElement($_str_indice);
						// define o primeiro valor como atributo
						//$this-&gt;_obj_xml-&gt;writeAttribute(&quot;id&quot;, $valor[key($valor)]);

						// retira a chave
						//array_shift($valor);

						// recursividade para inserir um elemento interno
						$this-&gt;addContent($valor);

						// finaliza o elemento
						$this-&gt;_obj_xml-&gt;endElement();

						// continua percorrendo o array
						continue;
					}

					// insere elementos que não contenham mais filhos
					@$this-&gt;_obj_xml-&gt;writeElement($chave,$valor);
				}

				return true;
			}
			else
			{
				// debug
				// array inválido
			}
		}

		/**
		* Método para retornar o arquivo XML gerado
		* @access Public
		* @return string
		*/
		public function showXML()
		{
			// finaliza o objeto
			$this-&gt;_obj_xml-&gt;setIndent(true);
			$this-&gt;_obj_xml-&gt;endElement();

			// retorna o XML gerado
			return $this-&gt;_obj_xml-&gt;outputMemory(true);
		}
	}
</pre>
<p>Está bem comentada. Acho que é bem fácil de entender.</p>
<p>Quem preferir baixar diretamente do PHPClasses: <a  href="http://www.phpclasses.org/browse/package/5769.html">Simple XML Generator</a></p>
<p>Em breve vou postar outras Classes PHP que ajudam a tornar a vida mais simples.</p>
<br/>Visualizações: 1017<br/>]]></content:encoded>
			<wfw:commentRss>http://marcos.blog.br/2009/11/classe-php-para-gerar-xml/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Menu em ExtJS com Permissões usando PHP e Mysql</title>
		<link>http://marcos.blog.br/2009/10/menu-em-extjs-com-permissoes-usando-php-e-mysql/</link>
		<comments>http://marcos.blog.br/2009/10/menu-em-extjs-com-permissoes-usando-php-e-mysql/#comments</comments>
		<pubDate>Thu, 29 Oct 2009 01:37:18 +0000</pubDate>
		<dc:creator>Marcos</dc:creator>
				<category><![CDATA[ExtJS]]></category>
		<category><![CDATA[Json]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://marcos.blog.br/?p=138</guid>
		<description><![CDATA[Uma das coisas que mais me deu dor de cabeça quando comecei a trabalhar com ExtJS foi montar uma estrutura de Menu Dinâmico de acordo com as permissões do usuário logado. Por isso vou compartilhar minha solução]]></description>
			<content:encoded><![CDATA[<p>Uma das coisas que mais me deu dor de cabeça quando comecei a trabalhar com <strong>ExtJS </strong>foi montar uma estrutura de <strong>Menu Dinâmico</strong> de acordo com as <strong>permissões</strong> do usuário logado. Por isso vou compartilhar minha solução:</p>
<p>Primeiro de tudo vamos criar o nosso <strong>banco de dados</strong>. Vamos precisar de duas tabelas: uma para o nosso <strong>menu</strong> e outra com as <strong>permissões de cada usuário</strong>.</p>
<p>A tabela do Menu terá os campos de id (o id do objeto no Extjs para facilitar manipulação posterior), o nome, o ícone, a pai (caso exista), a ordem e é claro a <strong>função que será chamada na ação do clique</strong>. Na segunda tabela vamos ter apenas duas chave, o id do usuário e o id do menu. Segue abaixo de exemplo a que eu utilizei:</p>
<h3>MySQL</h3>
<pre class="brush: sql">
#
# Estrutura da Tabela Menu
#

CREATE TABLE /*!32312 IF NOT EXISTS*/ `menu` (
  `id_menu` int(3) NOT NULL AUTO_INCREMENT,
  `id` varchar(20) DEFAULT NULL,
  `menu` varchar(70) DEFAULT NULL,
  `ordem` int(3) DEFAULT NULL,
  `pai` int(3) DEFAULT NULL,
  `ico` varchar(50) DEFAULT NULL,
  `funcao` varchar(80) DEFAULT NULL,
  PRIMARY KEY (`id_menu`)
) TYPE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=latin1;

#
# Estrutura da Tabela de Permissões
#

CREATE TABLE /*!32312 IF NOT EXISTS*/ `permissoes` (
  `id_usuario` int(3) NOT NULL DEFAULT &#039;0&#039;,
  `id_menu` int(3) NOT NULL DEFAULT &#039;0&#039;,
  PRIMARY KEY (`id_menu`,`id_usuario`)
) TYPE=MyISAM DEFAULT CHARSET=latin1;
</pre>
<p><em>Dica: Vale lembrar que o ícone dos pais são definidos pelo nome da classe CSS e os filhos devemos especificar o caminho físico da imagem. Não sei por que, mas sub-menus não possuem o atributo &#8220;iconCls&#8221;. No PHP já vamos levar isso em conta.</em></p>
<p>A outra parte do nosso Menu é a montagem do <strong>Json</strong> que irá ser lido no <strong>ExtJS</strong>. Este método foi testado apenas com 1 sub-nível de menu, mas é fácil de modificar para funcionar com mais. Se alguém fizer, comente a experiência. O método é bem simples de entender. Basicamente <strong>buscamos os ítens do Menu principal e percorremos ele em busca de sub-menus alocando tudo em um array associativo</strong>.</p>
<h3>PHP</h3>
<pre class="brush: php">
		private function trataObjJson($strJson,$arrObjs)
		{
			foreach($arrObjs AS $obj)
				$strJson = str_replace(&amp;amp;amp;amp;amp;quot;\&amp;amp;amp;amp;amp;quot;&amp;amp;amp;amp;amp;quot; . $obj . &amp;amp;amp;amp;amp;quot;\&amp;amp;amp;amp;amp;quot;&amp;amp;amp;amp;amp;quot;,$obj,$strJson);
			return $strJson;
		}

		public function getMenu()
		{
			if($this-&amp;amp;amp;amp;amp;gt;Search(&amp;amp;amp;amp;amp;quot;SELECT id_usuario FROM usuarios WHERE id_usuario=&amp;amp;amp;amp;amp;quot; . $_SESSION[&#039;id_usuario&#039;]))
			{
				$menu = &amp;amp;amp;amp;amp;quot;&amp;amp;amp;amp;amp;quot;;
				$tmpMenuPai = $this-&amp;amp;amp;amp;amp;gt;Search(&amp;amp;amp;amp;amp;quot;SELECT A.id_menu,id,menu,ordem,pai,ico,funcao FROM menu A JOIN permissoes B ON A.id_menu=B.id_menu WHERE A.pai=0 AND B.id_usuario=&amp;amp;amp;amp;amp;quot; . $_SESSION[&#039;id_usuario&#039;] . &amp;amp;amp;amp;amp;quot; ORDER By A.ordem&amp;amp;amp;amp;amp;quot;);
				$i=0;
				$funcoes = array();
				foreach($tmpMenuPai AS $item)
				{
					$menu[$i][&#039;text&#039;] 			= $item[&#039;menu&#039;];
					$menu[$i][&#039;iconCls&#039;] 		= $item[&#039;ico&#039;];
					$menu[$i][&#039;tabIndex&#039;] 		= $i;
					if($item[&#039;funcao&#039;]) {
						$menu[$i][&#039;id&#039;] 		= $item[&#039;id&#039;];

						$menu[$i][&#039;handler&#039;] 	= $item[&#039;funcao&#039;];
						$funcoes[] = $item[&#039;funcao&#039;];
					}

					$tmpMenuFilho = $this-&amp;amp;amp;amp;amp;gt;Search(&amp;amp;amp;amp;amp;quot;SELECT A.id_menu,menu,id,ordem,ico,funcao FROM menu A JOIN permissoes B ON A.id_menu=B.id_menu WHERE A.pai=&amp;amp;amp;amp;amp;quot; . $item[&#039;id_menu&#039;] . &amp;amp;amp;amp;amp;quot; AND B.id_usuario=&amp;amp;amp;amp;amp;quot; . $this-&amp;amp;amp;amp;amp;gt;_id . &amp;amp;amp;amp;amp;quot; ORDER By A.ordem&amp;amp;amp;amp;amp;quot;);
					$arrFilho = Array();
					$j=0;
					foreach($tmpMenuFilho AS $filho)
					{
						$arrFilho[$j][&#039;text&#039;]			= $filho[&#039;menu&#039;];
						$arrFilho[$j][&#039;icon&#039;]			= $filho[&#039;ico&#039;];
						if($filho[&#039;funcao&#039;]) {
							$arrFilho[$j][&#039;id&#039;] 		= $filho[&#039;id&#039;];

							$arrFilho[$j][&#039;handler&#039;] 	= $filho[&#039;funcao&#039;];
							$funcoes[] = $filho[&#039;funcao&#039;];
						}
						$j++;
					}
					if($arrFilho)
						$menu[$i][&#039;menu&#039;] = $arrFilho;
					$i++;
				}
				header(&amp;amp;amp;amp;amp;quot;Content-Type: application/json&amp;amp;amp;amp;amp;quot;);
				echo $this-&amp;amp;amp;amp;amp;gt;trataObjJson(json_encode($menu),$funcoes);
			}
		}
</pre>
<p>Observe que precisamos de um <strong>método auxiliar para tratar as funções</strong>. Isso se deve pelo fato da função <i>json_encode</i> do PHP colocar áspas em tudo, então para o ExtJS não interpretar nossa função como uma string e gerar um erro, <strong>utilizamos uma função para retira-las</strong>.</p>
<p>Agora que já temos a nossa estrutura de menu em Json, bastam poucas linhas em ExtJS para finalizar:</p>
<h3>ExtJS</h3>
<pre class="brush: javascript">
Ext.onReady(function(){
 	var conn = new Ext.data.Connection();
	conn.request({
		url: &#039;inc/php/menu.class.php&#039;,
		success: function(a){Ext.getCmp(&#039;menuPrincipal&#039;).bottomToolbar.add(Ext.util.JSON.decode(a.responseText));},
		failure: function(){Ext.MessageBox.alert(&#039;Erro&#039;, &#039;Erro ao carregar menu. Atualize a página.&#039;);}
	});
});
</pre>
<p>Espero ter ajudado. </p>
<br/>Visualizações: 922<br/>]]></content:encoded>
			<wfw:commentRss>http://marcos.blog.br/2009/10/menu-em-extjs-com-permissoes-usando-php-e-mysql/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Traçando Rota com a API do Google Maps</title>
		<link>http://marcos.blog.br/2009/10/tracando-rota-com-a-api-do-google-maps/</link>
		<comments>http://marcos.blog.br/2009/10/tracando-rota-com-a-api-do-google-maps/#comments</comments>
		<pubDate>Tue, 20 Oct 2009 12:59:59 +0000</pubDate>
		<dc:creator>Marcos</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Google Maps]]></category>
		<category><![CDATA[Usabilidade]]></category>

		<guid isPermaLink="false">http://marcos.blog.br/?p=131</guid>
		<description><![CDATA[Um recurso bem interessante do Google Maps é poder traçar rotas a partir de um endereço ou CEP de algum para se chegar a algum lugar.
Neste exemplo vamos usar um destino fixo e solicitar ao usuário o endereço de partida.
Antes de mais nada, precisamos adquirir a chave API do Google Maps digitando a URL em [...]]]></description>
			<content:encoded><![CDATA[<p><img class="size-thumbnail wp-image-132 alignleft" style="margin-left: 6px; margin-right: 6px; margin-top: 0px; margin-bottom: 0px;" title="maps" src="http://marcos.blog.br/wp-content/uploads/2009/10/maps2-150x150.jpg" alt="maps" width="150" height="150" />Um recurso bem interessante do <strong>Google Map</strong>s é poder <strong>traçar rotas</strong> a partir de um endereço ou CEP de algum para se chegar a algum lugar.</p>
<p>Neste exemplo vamos usar um destino fixo e solicitar ao usuário o endereço de partida.</p>
<p>Antes de mais nada, precisamos adquirir a <a  href="http://code.google.com/intl/pt-BR/apis/maps/signup.html" target="_self">chave API do Google Maps</a> digitando a URL em que sua página será hospedada (você consegue gerar chave para http://localhost também).</p>
<p>De posse da chave, vamos criar uma página HTML simples e incluir a API do google maps já com a nossa chave:</p>
<pre class="brush: javascript">

&lt;script src=&quot;http://maps.google.com/maps?file=api&amp;amp;v=2&amp;amp;key=[aqui-entra-a-chave-da-api]&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;
</pre>
<p>Agora vamos ao JavaScript com as funções necessárias para carregar o mapa e traçar a rota:</p>
<pre class="brush: javascript">
			// declaração de variáveis
			var map;
			var marker;

			// função que carrega o mapa inicial marcando o nosso ponto de chegada
			function load() {
				// verifica a compatibilidade do google maps
			  if (GBrowserIsCompatible()) {

				// Instancia o objeto e aplica na div &#039;mapa&#039;
				map = new GMap2(document.getElementById(&quot;mapa&quot;));
				// Especifica as coordenadas do centro do mapa e o zoom
				map.setCenter(new GLatLng(-20.339884,-40.287469), 14);
				// Especifica o div em que será exibido o detalhamento da rota
				directionsPanel = document.getElementById(&quot;route&quot;);
				gdir = new GDirections(map, directionsPanel);
				// Adiciona o evento de erros a função handleErrors
				GEvent.addListener(gdir, &quot;error&quot;, handleErrors);

				//Adiciona barra de zoom e setas para movimentação no mapa
				map.addControl(new GSmallMapControl());

				//Adiciona um marcador nas coordenadas de chegada
				var point = new GLatLng(-20.339884, -40.287469);
				marker = new GMarker(point);
				map.addOverlay(marker);
				marker.title = &quot;Shopping Vitória&quot;;

			  }
			}

			// Traça a Rota
			function setDirections(fromAddress, toAddress, locale){
				gdir.load(&quot;from: &quot; + fromAddress + &quot; to: &quot; + toAddress,{&quot;locale&quot;: &quot;pt_BR&quot;});
				// Remove o marcador inicial
				map.removeOverlay(marker);
			}

			// Especifica a origem e o destino
			function tracarRota() {
				setDirections(document.getElementById(&#039;from&#039;).value, &quot;Fernando Ferrari, 514, Goiabeiras, Vitória, ES&quot;);
			}

			// Função com tratamentos de erros
			function handleErrors()
			{
			   if (gdir.getStatus().code == G_GEO_UNKNOWN_ADDRESS)
				 alert(&quot;Não foi possível achar o endereço. Isso pode ter ocorrido porque o endereço digitado ainda não está inserido no googlemaps ou porque foi digitado incorretamente.\nCódigo do Erro: &quot; + gdir.getStatus().code);
			   else if (gdir.getStatus().code == G_GEO_SERVER_ERROR)
				 alert(&quot;A geocoding or directions request could not be successfully processed, yet the exact reason for the failure is not known.\n Código do Erro: &quot; + gdir.getStatus().code);
			   else if (gdir.getStatus().code == G_GEO_MISSING_QUERY)
				 alert(&quot;The HTTP q parameter was either missing or had no value. For geocoder requests, this means that an empty address was specified as input. For directions requests, this means that no query was specified in the input.\n Código do Erro: &quot; + gdir.getStatus().code);
			   else if (gdir.getStatus().code == G_GEO_BAD_KEY)
				 alert(&quot;Key inválida. Procure a key correta para este domínio no site do google. \n Código do Erro: &quot; + gdir.getStatus().code);
			   else if (gdir.getStatus().code == G_GEO_BAD_REQUEST)
				 alert(&quot;A directions request could not be successfully parsed.\n Código do Erro: &quot; + gdir.getStatus().code);
			   else alert(&quot;Ocorreu um erro inesperado.&quot;);
			}
</pre>
<p>Lembrando que na Tag &#8220;Body&#8221; é necessários chamarmos a função Load() para carregar o mapa inicial com nosso ponto de chegada marcado:</p>
<p>Para finalizar, o nosso formulário HTML deverá chamar a função tracarRota() como no código abaixo:</p>
<pre class="brush: html">

			&lt;form method=&quot;get&quot; action=&quot;#&quot; onsubmit=&quot;tracarRota(); return false;&quot;&gt;
				&lt;div&gt;
					&lt;label for=&quot;from&quot;&gt;Endereço de partida:&lt;/label&gt;
					&lt;input type=&quot;text&quot; id=&quot;from&quot; name=&quot;endereco&quot; value=&quot;Carioca, 353 - Vila Velha - ES - 29100450&quot; class=&quot;endereco&quot; /&gt;
					&lt;input type=&quot;submit&quot; value=&quot;Achar Caminho&quot; class=&quot;enviar&quot; /&gt;
				&lt;/div&gt;
			&lt;/form&gt;</pre>
<p><a  href="http://marcos.blog.br/exemplos/tracando-rota-com-google-maps.html" target="_blank">Confira o exemplo funciona</a>l</p>
<br/>Visualizações: 200<br/>]]></content:encoded>
			<wfw:commentRss>http://marcos.blog.br/2009/10/tracando-rota-com-a-api-do-google-maps/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Entenda o Sucesso do Twitter</title>
		<link>http://marcos.blog.br/2009/10/entenda-o-sucesso-do-twitter/</link>
		<comments>http://marcos.blog.br/2009/10/entenda-o-sucesso-do-twitter/#comments</comments>
		<pubDate>Mon, 05 Oct 2009 05:33:21 +0000</pubDate>
		<dc:creator>Marcos</dc:creator>
				<category><![CDATA[Dicas]]></category>
		<category><![CDATA[Twitter]]></category>

		<guid isPermaLink="false">http://marcos.blog.br/?p=127</guid>
		<description><![CDATA[Quer entender por que a simplicidade dos 140 caracteres do Twitter faz tanto sucesso?]]></description>
			<content:encoded><![CDATA[<p>Quer entender por que a simplicidade dos 140 caracteres do Twitter faz tanto sucesso?</p>
<p>Veja o vídeo abaixo (inglês) que explica de forma simples e direta:</p>
<p><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="400" height="300" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowfullscreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="src" value="http://vimeo.com/moogaloop.swf?clip_id=757146&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=&amp;fullscreen=1" /><embed type="application/x-shockwave-flash" width="400" height="300" src="http://vimeo.com/moogaloop.swf?clip_id=757146&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=&amp;fullscreen=1" allowscriptaccess="always" allowfullscreen="true"></embed></object></p>
<br/>Visualizações: 52<br/>]]></content:encoded>
			<wfw:commentRss>http://marcos.blog.br/2009/10/entenda-o-sucesso-do-twitter/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>10 Dicas Úteis de Usabilidade</title>
		<link>http://marcos.blog.br/2009/09/10-dicas-uteis-de-usabilidade/</link>
		<comments>http://marcos.blog.br/2009/09/10-dicas-uteis-de-usabilidade/#comments</comments>
		<pubDate>Wed, 30 Sep 2009 18:42:57 +0000</pubDate>
		<dc:creator>Marcos</dc:creator>
				<category><![CDATA[Usabilidade]]></category>
		<category><![CDATA[Client-Side]]></category>
		<category><![CDATA[Dicas]]></category>
		<category><![CDATA[RIA]]></category>

		<guid isPermaLink="false">http://marcos.blog.br/?p=104</guid>
		<description><![CDATA[Todos concordam que a usabilidade é um aspecto importante do Web design. Se você está trabalhando em um site do tipo portfolio, loja online ou aplicativo Web, tornando suas páginas de fácil e agradável navegação para seus visitantes a usabilidade é fundamental. Muitos estudos têm sido feitos ao longo dos anos sobre vários aspectos de Web e design de interface, e os resultados são valiosos para nos ajudar a melhorar o nosso trabalho. Aqui estão 10 dicas úteis de usabilidade que podem ajudar a melhorar a experiência do usuário em seu site.]]></description>
			<content:encoded><![CDATA[<p>Todos concordam que a<strong> usabilidade</strong> é um aspecto importante do Web design. Se você está trabalhando em um site do tipo portfólio, loja online ou aplicativo Web, tornando suas páginas de fácil e agradável navegação para seus visitantes a usabilidade é fundamental. Muitos estudos têm sido feitos ao longo dos anos sobre vários aspectos de Web e design de interface, e os resultados são valiosos para nos ajudar a melhorar o nosso trabalho. Aqui estão <strong>10 dicas úteis de usabilidade</strong> que podem ajudar a melhorar a experiência do usuário em seu site.</p>
<h2>1. A Melhor Forma de Trabalhar com Labels é Acima do Campo</h2>
<p>Um estudo realizado pela UX Matters considerou que a posição ideal para laebls em formulários está acima dos campos. Em muitas formas, os labels são colocados à esquerda dos campos, a criação de um layout de duas colunas, apesar de parecer bom, não é o layout mais fácil de usar. Por que isso? Como os formulários são geralmente orientados verticalmente, <strong>os usuários preenchem o formulário de cima para baixo</strong>. E seguindo o label campo abaixo é mais fácil do que encontrar o campo à direita.</p>
<div id="attachment_119" class="wp-caption alignnone" style="width: 490px"><a  href="http://www.tumblr.com/" target="_blank"><img class="size-full wp-image-119" title="tumblr" src="http://marcos.blog.br/wp-content/uploads/2009/09/tumblr1.png" alt="Tumblr possui um simples e elegante-se formulário que segue a recomendação UX Matter." width="480" height="414" /></a><p class="wp-caption-text">Tumblr possui um simples e elegante-se formulário que segue a recomendação UX Matter.</p></div>
<p>Label com posicionamento a esquerda também representa outro problema: você alinha à esquerda ou a direita os seus labels? alinhamento esquerdo faz com que o formulário seja lido mas desconecta os labels dos campos, o que torna difícil ver qual label se aplica a qual campo. Alinhando-se a direita   inverte: Contribui para uma boa aparência, mas de forma menos legível. Labels acima dos campos funcionam melhor na maioria das circunstâncias. O estudo também descobriu que os labels não devem ser ousados, embora essa recomendação não é conclusiva.</p>
<h2>2. Usuários Focam em Rostos</h2>
<p>Pessoas instintivamente identificam outras pessoas imediatamente. Em páginas da Web, tendemos a focalizar os rostos das pessoas e nos olhos, o que dá uma boa técnica de marketing para atrair a atenção. Mas a nossa atração para os rostos das pessoas e dos olhos é apenas o começo; desejamos olhar realmente no sentido em que a pessoa da imagem está olhando.</p>
<div id="attachment_118" class="wp-caption alignnone" style="width: 490px"><img class="size-full wp-image-118" title="eyes1" src="http://marcos.blog.br/wp-content/uploads/2009/09/eyes11.jpg" alt="Eye-tracking: mapa de calor de um bebê olhando diretamente para nós, a partir do estudo UsableWorld." width="480" height="342" /><p class="wp-caption-text">Eye-tracking: mapa de calor de um bebê olhando diretamente para nós, a partir do estudo UsableWorld.</p></div>
<p><img class="alignnone size-full wp-image-117" title="eyes2" src="http://marcos.blog.br/wp-content/uploads/2009/09/eyes21.jpg" alt="eyes2" width="480" height="344" /></p>
<p>E agora o bebê está olhando para o conteúdo. Observe o aumento de pessoas olhando para o título e texto.</p>
<p>Aqui está o <a  href="http://usableworld.com.au/2009/03/16/you-look-where-they-look/" target="_blank">estudo eye-tracking</a> que demonstra isso. Estamos instintivamente atraídos para rostos, mas se esse cara está procurando algum lugar diferente de nós, vamos também olhar nessa direção. Tire proveito desse fenômeno, chamando a atenção dos usuários para as partes mais importantes da sua página ou anúncio.</p>
<h2>3. Qualidade do Design é um Indicador de Credibilidade</h2>
<p>Vários estudos têm sido realizados para descobrir exatamente o que influencia a percepção das pessoas sobre a credibilidade de um site:</p>
<ul>
<li><a  href="http://captology.stanford.edu/pdf/Stanford-MakovskyWebCredStudy2002-prelim.pdf" target="_blank">Stanford-Makovsy Web Credibility Study 2002: Investiga o que faz hoje Sites com Credibilidade</a></li>
<li><a  href="http://captology.stanford.edu/pdf/p61-fogg.pdf" target="_blank">Que faz um Web site com Crédito? Um relatório sobre um grande estudo quantitativo</a></li>
<li><a  href="http://captology.stanford.edu/pdf/p80-fogg.pdf" target="_blank">Elementos de Credibilidade Computacional</a></li>
<li>Elementos que afetam a credibilidade da Web: Primeiros Resultados de um Relatório de Estudos Próprios (Processo da ACM CHI 2000 Conference on Human Factors in Computing Systems, v.2, New York: ACM Press)</li>
</ul>
<p><a  href="http://feedafever.com/" target="_blank"><img class="alignnone size-full wp-image-116" title="fever" src="http://marcos.blog.br/wp-content/uploads/2009/09/fever1.jpg" alt="fever" width="480" height="361" /></a></p>
<p>Não sabemos se a aplicação do <a  href="http://feedafever.com/" target="_blank">Fever app</a> é boa, mas a interface do usuário elegante do site traz uma grande primeira impressão.</p>
<p>Um dado interessante desses estudos é que os usuários realmente julgam um livro pela capa&#8230; ou melhor, um site pelo seu design. Elementos tais como layout, a coerência, a tipografia, a cor e o estilo de todos afetam a maneira como os usuários percebem o seu site e que tipo de imagem terão de seu projeto. Seu site não deve apenas passar uma boa imagem, mas também o caminho certo para o seu público.</p>
<h2>4. A Maioria dos Usuários <span style="text-decoration: line-through;">Não</span> Usam Rolagem</h2>
<p>Um estudo de Jakob Nielsen sobre o quanto os usuários usam rolagem (priorizando a Usabilidade Web) revelou que apenas 23% dos visitantes usam a rolagem em sua primeira visita a um site. Isto significa que 77% dos visitantes não irá rolar, eles vão apenas visualizar o conteúdo acima da dobra (ou seja, a área da página que está visível na tela sem rolagem para baixo). Além do mais, o percentual de usuários que rolam a página diminui com visitas subsequentes, com apenas 16% em sua segunda visita. Esses dados enfatizam o quão importante é colocar o seu conteúdo-chave em uma posição de destaque, especialmente na página principal.</p>
<p>Isso não significa que você deve entupir tudo na área superior da página, basta que você faça o melhor uso desse espaço. Entupir com conteúdo fará apenas o conteúdo inacessível, quando o usuário vê muita informação, não sabe por onde começar a procurar.</p>
<div id="attachment_109" class="wp-caption alignnone" style="width: 490px"><img class="size-full wp-image-109" title="basecamp" src="http://marcos.blog.br/wp-content/uploads/2009/09/basecamp.jpg" alt="Basecamp faz bom uso do espaço. Acima da dobra (768 pixels de altura), ele mostra uma tela grande, proposição de valor, chamada à ação, lista de clientes, vídeos e lista curta de imagens." width="480" height="339" /><p class="wp-caption-text">Basecamp faz bom uso do espaço. Acima da dobra (768 pixels de altura), ele mostra uma tela grande, proposição de valor, chamada à ação, lista de clientes, vídeos e lista curta de imagens.</p></div>
<p>Isso é muito importante para a página inicial, onde a maioria dos visitantes irá chegar. Portanto, forneça os elementos essenciais lá:</p>
<ol>
<li>Nome do Site;</li>
<li>Valor Proposto pelo Site (isto é, como os usuários se beneficiam ao usá-lo);</li>
<li>Navegação para as principais seções do site que são relevantes para o usuário.</li>
</ol>
<p>No entanto, os hábitos dos usuários mudaram significativamente desde então. Estudos recentes comprovam que os usuários são muito confortáveis com a rolagem e em algumas situações  estão dispostos a rolar para o final da página. Muitos usuários estão mais confortáveis com a rolagem do que com uma paginação, e para muitos usuários a informação mais importante da página não é necessariamente colocado &#8220;acima da dobra&#8221; (que é por causa da variedade de resoluções de exibição disponíveis um termo bastante ultrapassada, obsoleta ). Por isso, é uma boa idéia dividir o layout em seções para facilitar a digitalização, separando-os com um monte de espaço em branco.</p>
<p>Para mais informações, por favor dê uma olhada nos artigos <a  href="http://blog.clicktale.com/?p=19" target="_blank">Unfolding the fold</a> (Clicktale), <a  href="http://www.surl.org/usabilitynews/41/paging.asp" target="_blank">Paging VS Scrolling</a> (Wichita University &#8211; sURL), <a  rel="nofollow" href="http://www.boxesandarrows.com/view/blasting-the-myth-of">Blasting the Myth of the Fold</a> (Boxes and Arrows). (obrigado, Fred Leuck).</p>
<h2>5. Azul é a Melhor Cor Para Links</h2>
<p>Embora dar ao seu projeto um layout único, quando se trata de usabilidade, fazer o que todo mundo está fazendo é o melhor. Siga as convenções, porque quando as pessoas visitam um novo site, o primeiro lugar que vão olhar é para as coisas que estão nos lugares onde eles encontram na maioria dos outros sites, eles usarão de sua experiência para dar sentido a este novo conteúdo. Isso é conhecido como <strong>padrões de uso</strong>. As pessoas esperam que certas coisas sejam o mesmo, como as cores dos links, a localização do logotipo do site, o comportamento de navegação com guias e assim por diante.</p>
<div id="attachment_110" class="wp-caption alignnone" style="width: 490px"><img class="size-full wp-image-110" title="google2" src="http://marcos.blog.br/wp-content/uploads/2009/09/google2.png" alt="O Google mantém todos os links em seus sites azul por uma razão: a cor é familiar para muitos usuários, o que torna mais fácil de localizar." width="480" height="322" /><p class="wp-caption-text">O Google mantém todos os links em seus sites azul por uma razão: a cor é familiar para muitos usuários, o que torna mais fácil de localizar.</p></div>
<p>Que cor deve ter os seus links? A primeira consideração é o contraste: links têm que ser escuro (ou claro) o suficiente para contrastar com a cor de fundo. Em segundo lugar, eles devem se destacar da cor do resto do texto, por isso, não usem links preto com texto em preto. E, finalmente, a pesquisa mostra (Van Schaik e Ling) que, se a usabilidade é a sua prioridade, usando o azul para os links é melhor. A cor padrão do navegador para link  é azul, então as pessoas esperam isso. Escolher uma cor diferente de modo algum é um problema, mas pode afetar a rapidez com que os usuários achem.</p>
<h2>6. O Ideal Para Caixa de Pesquisa são 27 Caracteres de Largura</h2>
<p>Qual é a largura ideal de uma caixa de pesquisa? Existe uma coisa dessas? Jakob Nielsen realizou um estudo de usabilidade no comprimento de caixas de pesquisa do site (priorizando Usabilidade Web). Acontece que a maioria das caixas de pesquisa de hoje são demasiadamente curtas. O problema com caixas curtas é que mesmo que você possa digitar uma consulta longa, apenas uma parte do texto vai ser visível em uma hora, o que torna difícil para rever ou editar o que você digitou.</p>
<p>O estudo constatou que a <strong>caixa de pesquisa média é de 18 caracteres de largura</strong>. Os dados mostraram que 27% das consultas eram demasiadamente longas para caber dentro dele. <strong>Estendendo a caixa para 27 caracteres se atende 90% das consultas</strong>. Lembre-se, você pode definir larguras usando ems, não apenas pixels e points. Um &#8220;em&#8221; é a largura e altura de um caractér &#8220;m&#8221; (usando qualquer tamanho da fonte o site também usará). Então, use essa medida para dimensionar a largura do campo de entrada de texto até 27 caracteres de largura.</p>
<div id="attachment_111" class="wp-caption alignnone" style="width: 421px"><img class="size-full wp-image-111" title="apple" src="http://marcos.blog.br/wp-content/uploads/2009/09/apple.jpg" alt="A caixa de pesquisa da Apple é um pouco curta demais, cortando a consulta, &quot;Microsoft Office 2008.&quot;" width="411" height="194" /><p class="wp-caption-text">A caixa de pesquisa da Apple é um pouco curta demais, cortando a consulta, &quot;Microsoft Office 2008.&quot;</p></div>
<p>Em geral, as caixas de pesquisa são melhores compridas do que curtas, de modo que os usuários podem rapidamente analisar, verificar e submeter à consulta. Esta orientação é muito simples, mas, infelizmente, muitas vezes rejeitada ou ignorada. Alguns preenchimentos no campo de entrada também pode melhorar o design e experiência do usuário.</p>
<h2>7. Espaço em Branco Melhora a Compreensão</h2>
<p>A maioria dos designers sabem o valor do espaço em branco, que é o espaço vazio entre os parágrafos, imagens, botões e outros itens na página. O espaço em branco ordena uma página dando  espaço para os itens respirarem. Nós também podemos agrupar itens, diminuindo o espaço entre eles e aumentando o espaço entre eles e outros itens na página. Isso é importante para mostrar as relações entre os itens (por exemplo, mostrando que este botão aplica-se a este conjunto de itens) e a construção de uma hierarquia de elementos na página.</p>
<div id="attachment_112" class="wp-caption alignnone" style="width: 490px"><img class="size-full wp-image-112" title="netsetter" src="http://marcos.blog.br/wp-content/uploads/2009/09/netsetter.jpg" alt="Observe a grande margem de conteúdo, preenchimento e espaçamento sobre o Netsetter. Todo o espaço que torna o conteúdo fácil e confortável para ler." width="480" height="400" /><p class="wp-caption-text">Observe a grande margem de conteúdo, preenchimento e espaçamento sobre o Netsetter. Todo o espaço que torna o conteúdo fácil e confortável para ler.</p></div>
<p>O espaço em branco também torna o conteúdo mais legível. Um estudo (Lin, 2004) descobriu que <strong>o bom uso do espaço em branco entre parágrafos e nas margens esquerda e direita aumenta a compreensão em quase 20%</strong>. Os leitores acham mais fácil se concentrar no processo e conteúdo generosamente espaçadas.</p>
<p>De fato, de acordo com Chaperro, Shaikh e Baker, o layout de uma página Web (incluindo espaços em branco, cabeçalhos, recuo e números) não podem influenciar o desempenho mensurável, mas não influenciam a satisfação do usuário e experiência.</p>
<h2>8. Um Teste De Usuário Eficaz Não Tem Que Ser Extenso</h2>
<p>Um <a  href="http://www.useit.com/alertbox/20000319.html" target="_blank">estudo de Jakob Nielsen</a> sobre o número ideal de cobaias de testes de usabilidade mostra que os testes com apenas cinco usuários revelaria cerca de 85% de todos os problemas com o seu site, enquanto que 15 usuários se encontraria praticamente todos os problemas.</p>
<div id="attachment_113" class="wp-caption alignnone" style="width: 490px"><img class="size-full wp-image-113" title="usertests" src="http://marcos.blog.br/wp-content/uploads/2009/09/usertests.png" alt="Fonte: Jakob Nielsen’s AlertBox" width="480" height="287" /><p class="wp-caption-text">Fonte: Jakob Nielsen’s AlertBox</p></div>
<p>Os maiores problemas normalmente são descobertos pelo primeiro ou segundo usuário, e os testadores seguintes confirmam estas questões e descobrem as restantes de menor importância. Apenas dois usuários de teste, provavelmente encontraria a metade dos problemas em seu site. Isto significa que o teste não tem de ser extensivo ou caro para produzir bons resultados. Os maiores ganhos são obtidos quando se passa de zero usuários de teste para um, por isso não tenha medo de fazer muito pouco: <strong>qualquer teste é melhor do que nada</strong>.</p>
<h2>9. Páginas Informativas Ajudam a Destacar seu Produto</h2>
<p>Se seu site tem páginas de produto, as pessoas que compram on-line definitivamente querem vê-los. Mas as páginas de muitos produtos não dispõem de informações suficientes, mesmo para os visitantes fazerem uma verificação rápida. Este é um problema grave, porque a informação de produto ajudam as pessoas a tomarem a decisão de compra. A pesquisa mostra que produtos com informação pobres são cerca de 8% dos problemas de usabilidade e até 10% de falha do usuário (ou seja, o usuário desiste e deixa o site) (Priorizando Usabilidade Web).</p>
<div id="attachment_114" class="wp-caption alignnone" style="width: 490px"><img class="size-full wp-image-114" title="ipod" src="http://marcos.blog.br/wp-content/uploads/2009/09/ipod.jpg" alt="A Apple fornece separado páginas de &quot;Especificações técnicas&quot; para seus produtos, e mantém os detalhes complicados longe das páginas mais simples de marketing, mas proporciona acesso fácil quando eles são necessárias." width="480" height="320" /><p class="wp-caption-text">A Apple fornece separado páginas de &quot;Especificações técnicas&quot; para seus produtos, e mantém os detalhes complicados longe das páginas mais simples de marketing, mas proporciona acesso fácil quando eles são necessárias.</p></div>
<p>Forneça informações detalhadas sobre seus produtos, mas não caia na armadilha de bombardear usuários com muito texto. <strong>Torne a informação mais fácil de digerir</strong>. Torne a página agradável e divida o texto em segmentos pequenos e com abundância de sub-títulos. Adicionar  abundância de imagens para o seu produto, e usar a linguagem certa: <strong>não usar jargão que os visitantes podem não entender</strong>.</p>
<h2></h2>
<h2>10. A Maioria Dos Usuários Estão Cegos Para Publicidade</h2>
<p>Jakob Nielsen relata em sua pesquisa <a  href="http://www.useit.com/alertbox/banner-blindness.html" target="_blank">Alertbox</a> que a maioria dos usuários são essencialmente cegos para banners. Se eles estão procurando um trecho de informação em uma página ou são absorvidos pelo conteúdo, eles não vão se distrair com os anúncios na lateral.</p>
<p>A implicação disso é que os usuários não apenas irão evitar os anúncios, mas que eles <strong>vão evitar qualquer coisa que se pareça com um anúncio, mesmo se não seja um anúncio</strong>. Alguns itens de navegação muito estilosos pode ser parecidos com banners, deve-se ter cuidado com esses elementos.</p>
<div id="attachment_115" class="wp-caption alignnone" style="width: 490px"><img class="size-full wp-image-115" title="flashden" src="http://marcos.blog.br/wp-content/uploads/2009/09/flashden.jpg" alt="Os banners quadrado na lateral esquerda do FlashDen não são realmente anúncios: eles são links de conteúdo. Eles se parecem muito próximas à banners e isso pode ser ignorado por alguns usuários." width="480" height="411" /><p class="wp-caption-text">Os banners quadrado na lateral esquerda do FlashDen não são realmente anúncios: eles são links de conteúdo. Eles se parecem muito próximas à banners e isso pode ser ignorado por alguns usuários.</p></div>
<p>Dito isto, os anúncios que se parecem com conteúdo irão levar as pessoas a clica-los. Isso pode gerar mais receita publicitária, mas existe o custo de perda de confiança dos seus usuários, ao clicar em coisas que achavam ser conteúdo genuíno. Antes de enveredar por esse caminho, considerar o fator: <strong>receitas de curto prazo versus confiança a longo prazo</strong>.</p>
<h2>Bônus: Resultados de Nosso Estudo de Caso</h2>
<p>Nos últimos anos, a equipe editorial do Smashing Magazine realizou uma série de estudos de caso em uma tentativa de identificar soluções de design e práticas comuns. Até agora, nós analisamos os formulários da Web, blogs, tipografia e carteiras, e mais estudos de caso serão publicados no próximo mês. Nós encontramos alguns padrões interessantes que poderiam servir como diretrizes para o seu próximo projeto.</p>
<p>Aqui, vamos rever algumas das práticas e padrões de projeto que descobrimos em nossos estudos de caso nesta visão geral breve e compacta, para sua conveniência.</p>
<p>Segundo nosso<a  href="http://www.smashingmagazine.com/2009/08/20/typographic-design-survey-best-practices-from-the-best-blogs/" target="_blank"> estudo de tipografia</a>:</p>
<ul>
<li><strong>Altura da Linha (em pixels) ÷ tamanho da fonte (em pixels) = 1,48 </strong><br />
1,5 geralmente é recomendada em livros clássicos tipográfico, e o nosso estudo confirma essa regra. Muito poucos sites usam nada menos do que isso. E o número de sites que passar por cima de 1,48 diminui à medida que você começa mais a partir deste valor.</li>
<li><strong>Comprimento de linha (pixels) ÷ altura da linha (pixels) = 27,8 </strong><br />
O comprimento da linha média é de 538,64 pixels (excluindo margens e enchimento), que é bastante grande, considerando que muitos sites ainda tem de 12 a 13 pixels em tamanho de fonte.</li>
<li><strong>Espaço entre parágrafos (pixels) ÷ altura da linha (pixels) = 0,754 </strong><br />
Acontece que o espaçamento entre parágrafos (ou seja, o espaço entre a última linha de um parágrafo e a primeira linha da próxima) raramente é igual ao principal (o que seria a principal característica do ritmo vertical perfeito). Mais frequentemente, espaçamento entre parágrafos é apenas 75% do ponto principal. A razão pode ser que o líder geralmente inclui o espaço ocupado por descendentes, e porque a maioria dos personagens não tem descendentes, espaço em branco adicional é criado sob a linha.</li>
<li><strong>O número ideal de caracteres por linha é de 55 a 75 </strong><br />
Segundo o clássico livro tipográfico, o número ideal de caracteres por linha é entre 55 e 75, mas entre 75 e 85 caracteres por linha é mais popular na prática.</li>
</ul>
<p>De acordo com nosso <a  href="http://www.smashingmagazine.com/2008/07/24/a-small-study-of-big-blogs/" target="_blank">estudo de design de blogs</a>:</p>
<ul>
<li>Layouts geralmente têm uma largura fixa (pixel-based) (92%) e são geralmente centrada (94%). A largura de layouts fixos varia entre 951 e 1000 pixels (56%)</li>
<li>A página principal mostra trechos de 10 a 20 posts (62%).</li>
<li>58% do total de layout de um site é usado para exibir o conteúdo principal.</li>
</ul>
<p>Segundo nosso <a  href="http://www.smashingmagazine.com/2008/07/04/web-form-design-patterns-sign-up-forms/" target="_blank">estudo de design de formulário Web</a>:</p>
<ul>
<li>O link de cadastro intitula-se &#8220;inscrever&#8221; (40%) e é colocado no canto superior direito.</li>
<li>Formulários de Inscrição têm layouts simples, para evitar confundir os usuários (61%).</li>
<li>Títulos de campos de entrada estão em negrito (62%), e os campos são dispostas verticalmente mais do que eles estão dispostos horizontalmente (86%).</li>
<li>Designers tendem a incluir alguns campos obrigatórios e alguns campos opcionais.</li>
<li>Confirmação de e-mail não é exibida (82%), mas a confirmação de senha é (72%).</li>
<li>O botão &#8220;Enviar&#8221; ou é alinhado à esquerda (56%) ou centralizado (26%).</li>
</ul>
<p>De acordo com nosso <a  href="http://www.smashingmagazine.com/2009/09/17/portfolio-design-study-design-patterns-and-current-practices/" target="_blank">estudo de sites de portfólio</a>:</p>
<ul>
<li>89% dos layouts são centrados horizontalmente, e a maioria deles tem um grande menu de navegação horizontal.</li>
<li>47,2% dos portfólios tem a página do cliente, e 67,2% têm algum tipo de página de serviços autônomos.</li>
<li>63,6% têm uma página detalhada para cada projeto, incluindo estudos de caso, depoimentos, apresentações de slides com imagens, rascunhos e esboços.</li>
<li>Páginas de Contato contêm instruções de número de telefone, endereço de e-mail, endereço postal, vCard e formulário on-line.</li>
</ul>
<p>Este Post é uma tradução do original: <a  href="http://www.smashingmagazine.com/2009/09/24/10-useful-usability-findings-and-guidelines/" target="_blank">10 Useful Usability Findings and Guidelines<br />
</a></p>
<br/>Visualizações: 155<br/>]]></content:encoded>
			<wfw:commentRss>http://marcos.blog.br/2009/09/10-dicas-uteis-de-usabilidade/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Selecionando e recortando imagem com jQuery</title>
		<link>http://marcos.blog.br/2009/09/selecionando-e-recortando-imagem-com-jquery/</link>
		<comments>http://marcos.blog.br/2009/09/selecionando-e-recortando-imagem-com-jquery/#comments</comments>
		<pubDate>Sat, 26 Sep 2009 16:51:03 +0000</pubDate>
		<dc:creator>Marcos</dc:creator>
				<category><![CDATA[jQuery]]></category>
		<category><![CDATA[Dicas]]></category>

		<guid isPermaLink="false">http://marcos.blog.br/?p=85</guid>
		<description><![CDATA[Todo mundo já deve ter visto em alguns sites, ao inserir a imagem do profile, uma tela onde vc seleciona parte da imagem que vc fez upload para ser recortada. A maioria já pré-estabelece a proporção correta para que seu avatar não fique feio ao ser exibido no layout do site.
O bom dessas ferramentas, é [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft size-full wp-image-86" style="margin-left: 5px; margin-right: 5px;" title="Jcrop" src="http://marcos.blog.br/wp-content/uploads/2009/09/Jcrop.jpg" alt="Jcrop" width="214" height="190" />Todo mundo já deve ter visto em alguns sites, ao inserir a imagem do profile, uma tela onde vc seleciona parte da imagem que vc fez upload para ser recortada. A maioria já pré-estabelece a proporção correta para que seu avatar não fique feio ao ser exibido no layout do site.</p>
<p>O bom dessas ferramentas, é que elas podem ser usadas em sistemas CMS onde usuários leigos podem inserir tranquilamente a imagem da matéria de capa sem ter que depender de um designer (e sem estragar o layout dele).</p>
<p>Uma ferramenta poderosa é o <a  href="http://deepliquid.com/projects/Jcrop/demos.php" target="_blank">Jcrop</a>, ela oferece bloqueio de proporção, animação e você ainda pode personalizar o css e deixar mais a cara da sua aplicação. E ainda é cross-browser.</p>
<p>Como usar é bem simples, basta incluir o arquivo do plugin e aplicar o plugin com o seguinte comando:</p>
<pre id="line45">
<pre class="brush: javascript">

$(function(){
	$(&#039;#id-da-imagem&#039;).Jcrop();
});
</pre>
</pre>
<p>Claro que esta é a forma mais simples, mas na área de <a  href="http://deepliquid.com/projects/Jcrop/demos.php" target="_blank">exemplos do site</a> existem os códigos para você incrementar este código da maneira que você precisar.</p>
<p>Mas não pára por aí, não adianta selecionar a parte da imagem que você quer se não houver o corte da imagem. Para isso vou usar o exemplo do próprio autor utilizando a biblioteca GD do PHP.</p>
<p>Antes de mais nada, precisamos postar as posições a serem cortadas. Para isso, utilize campos input hidden da seguinte forma:</p>
<pre class="brush: html">
	&lt;input type=&quot;hidden&quot; id=&quot;x&quot; name=&quot;x&quot; /&gt;
	&lt;input type=&quot;hidden&quot; id=&quot;y&quot; name=&quot;y&quot; /&gt;
	&lt;input type=&quot;hidden&quot; id=&quot;w&quot; name=&quot;w&quot; /&gt;
	&lt;input type=&quot;hidden&quot; id=&quot;h&quot; name=&quot;h&quot; /&gt;
</pre>
<p>E a seguinte função para popular esses campos:</p>
<pre class="brush: javascript">
jQuery(function(){
        jQuery(&#039;#id-da-imagem&#039;).Jcrop({
                aspectRatio: 1,
                onSelect: updateCoords
        });
});

function updateCoords(c)
{
        jQuery(&#039;#x&#039;).val(c.x);
        jQuery(&#039;#y&#039;).val(c.y);
        jQuery(&#039;#w&#039;).val(c.w);
        jQuery(&#039;#h&#039;).val(c.h);
};
</pre>
<p>Postado as coordenadas da imagem, utilizamos o seguinte código PHP para criar a nova imagem:</p>
<pre class="brush: php">
$targ_w = $targ_h = 150;
$jpeg_quality = 90;

$src = &#039;demo_files/flowers.jpg&#039;;
$img_r = imagecreatefromjpeg($src);
$dst_r = ImageCreateTrueColor( $targ_w, $targ_h );

imagecopyresampled($dst_r,$img_r,0,0,$_POST[&#039;x&#039;],$_POST[&#039;y&#039;],
    $targ_w,$targ_h,$_POST[&#039;w&#039;],$_POST[&#039;h&#039;]);

header(&#039;Content-type: image/jpeg&#039;);
imagejpeg($dst_r, null, $jpeg_quality);
</pre>
<br/>Visualizações: 182<br/>]]></content:encoded>
			<wfw:commentRss>http://marcos.blog.br/2009/09/selecionando-e-recortando-imagem-com-jquery/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Editor Online de Imagens</title>
		<link>http://marcos.blog.br/2009/09/editor-online-de-imagens/</link>
		<comments>http://marcos.blog.br/2009/09/editor-online-de-imagens/#comments</comments>
		<pubDate>Fri, 25 Sep 2009 04:19:20 +0000</pubDate>
		<dc:creator>Marcos</dc:creator>
				<category><![CDATA[Dicas]]></category>

		<guid isPermaLink="false">http://marcos.blog.br/?p=76</guid>
		<description><![CDATA[Editor Online de Imagens em Flash]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft size-medium wp-image-79" style="margin-top: 0px; margin-bottom: 0px; margin-left: 5px; margin-right: 5px;" title="printscreen" src="http://marcos.blog.br/wp-content/uploads/2009/09/Untitled-2-300x221.jpg" alt="Untitled-2" width="210" height="175" /> Vai uma dica rápida que é uma mão na roda em algumas situações. Se você está longe do seu PC, ou pior, não tem programas de Edição de Imagens por que você é programador, mas surgiu a necessidade.</p>
<p>Simples, faça online:</p>
<p><a  href="http://www.pixlr.com/editor/">http://www.pixlr.com/editor/</a></p>
<p>Esse editor foi desenvolvido em Flash, mas até carrega rapidinho. Abre arquivos clássicos como JPG, GIF e arquivos vetores como PNG e PSD (photoshop).</p>
<br/>Visualizações: 146<br/>]]></content:encoded>
			<wfw:commentRss>http://marcos.blog.br/2009/09/editor-online-de-imagens/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Carrossel com Jquery</title>
		<link>http://marcos.blog.br/2009/09/carrossel-com-jquery/</link>
		<comments>http://marcos.blog.br/2009/09/carrossel-com-jquery/#comments</comments>
		<pubDate>Fri, 25 Sep 2009 04:05:45 +0000</pubDate>
		<dc:creator>Marcos</dc:creator>
				<category><![CDATA[jQuery]]></category>
		<category><![CDATA[JavaScript]]></category>

		<guid isPermaLink="false">http://marcos.blog.br/?p=55</guid>
		<description><![CDATA[Existe Plugins para tudo quando se está falando em jQuery. Porém a algum tempo atrás eu precisei de um plugin para fazer um carrossel para exibir alguns elementos de lista (&#60;li&#62;) de forma mais bacana no site da Interwise.
No entanto, a maioria dos plugins que encontrei eram já desenhados pensando em imagens. Os que eram [...]]]></description>
			<content:encoded><![CDATA[<p>Existe <a  href="http://plugins.jquery.com/" target="_blank">Plugins</a> para tudo quando se está falando em jQuery. Porém a algum tempo atrás eu precisei de um plugin para fazer um carrossel para exibir alguns elementos de lista (&lt;li&gt;) de forma mais bacana no site da <a  href="http://interwise.com.br" target="_blank">Interwise</a>.</p>
<p>No entanto, a maioria dos plugins que encontrei eram já desenhados pensando em imagens. Os que eram mais genéricos, eram grandes, de difícil personalização.</p>
<p>Perdi tanto tempo testando que nem me lembrei de como é fácil fazer as coisas com jQuery. Foi aí que resolvi escrever um código simples que resolvesse o meu problema.</p>
<p>E a seguir está o código. Simples, fácil de personalizar e que resolveu a situação.</p>
<pre class="brush: javascript">
var tamCarrosel = ($(&quot;#carroselEfeito li&quot;).length-1);

$(&#039;#carrosel_proximo&#039;).click(function() {
	if(i == 0)
		$(&#039;#seta_esquerda a&#039;).css({&#039;backgroundPosition&#039;:&#039;0 0&#039;});
	if(i &lt; tamCarrosel){
		$(&#039;#carroselEfeito li&#039;).eq(i).animate({ left : &quot;-&quot;+700}, function() {
			$(&#039;#carroselEfeito li&#039;).eq(i+1).css({ left: &quot;700px&quot;});
			$(&#039;#carroselEfeito li&#039;).eq(i).hide();
			$(&#039;#carroselEfeito li&#039;).eq(i+1).animate({left: &quot;-&quot;+0});
			i++;
			if(i == tamCarrosel)
				$(&#039;#seta_direita a&#039;).css({&#039;backgroundPosition&#039;:&#039;0 75px&#039;});
		});
	}
});
$(&#039;#carrosel_anterior&#039;).click(function(){
	if(i == tamCarrosel)
		$(&#039;#seta_direita a&#039;).css({&#039;backgroundPosition&#039;:&#039;0 0&#039;});
	if(0 &lt; tamCarrosel &amp;&amp; i&gt;0){
		$(&#039;#carroselEfeito li&#039;).eq(i).animate({left : &quot;+&quot;+700}, function(){
			$(&#039;#carroselEfeito li&#039;).eq(i-1).css({right: &quot;700px&quot;});
			$(&#039;#carroselEfeito li&#039;).eq(i).hide();
			$(&#039;#carroselEfeito li&#039;).eq(i-1).animate({left: &quot;-&quot;+0});
			i--;
			if(i == 0)
				$(&#039;#seta_esquerda a&#039;).css({&#039;backgroundPosition&#039;:&#039;0 75px&#039;});
		});
	}
});
</pre>
<p>E o HTML, mais simples ainda:</p>
<pre class="brush: html">
&lt;code&gt;
		&lt;div id=&quot;carrosel&quot;&gt;

			&lt;div class=&quot;centro&quot;&gt;
				&lt;div id=&quot;seta_esquerda&quot;&gt;&lt;a id=&quot;carrosel_anterior&quot; href=&quot;javascript:void(0)&quot;&gt;&lt;/a&gt;&lt;/div&gt;
				&lt;div id=&quot;conteudo_carrosel&quot;&gt;
					&lt;ul id=&quot;carroselEfeito&quot;&gt;
						&lt;li&gt;ítem 01&lt;/li&gt;
						&lt;li&gt;ítem 02&lt;/li&gt;
						&lt;li&gt;ítem n&lt;/li&gt;
					&lt;/ul&gt;
				&lt;/div&gt;
				&lt;div id=&quot;seta_direita&quot;&gt;&lt;a id=&quot;carrosel_proximo&quot; href=&quot;javascript:void(0)&quot;&gt;&lt;/a&gt;&lt;/div&gt;
			&lt;/div&gt;
		&lt;/div&gt;
&lt;/code&gt;
</pre>
<p>Vou sempre postar os plugins mais interessantes que já testei para que outros economizem o tempo que já gastei pesquisando sobre. Obviamente que algumas cada caso é um caso. <img src='http://marcos.blog.br/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<br/>Visualizações: 308<br/>]]></content:encoded>
			<wfw:commentRss>http://marcos.blog.br/2009/09/carrossel-com-jquery/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
