<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	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/"
	>

<channel>
	<title>John Marques.com.br - Web Developer - Artigos sobre PHP, jQuery, Ajax, CSS, Web Standards e etc</title>
	<atom:link href="http://www.johnmarques.com.br/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.johnmarques.com.br</link>
	<description>Artigos sobre PHP, AJAX,  JQUERY, CSS, XHTML, Web Standards.</description>
	<lastBuildDate>Mon, 30 Jan 2012 20:55:44 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Alterando o nome do computador no Ubuntu</title>
		<link>http://www.johnmarques.com.br/linux/alterando-o-nome-do-computador-no-ubuntu/</link>
		<comments>http://www.johnmarques.com.br/linux/alterando-o-nome-do-computador-no-ubuntu/#comments</comments>
		<pubDate>Mon, 30 Jan 2012 20:54:13 +0000</pubDate>
		<dc:creator>John Marques</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Ubuntu]]></category>

		<guid isPermaLink="false">http://www.johnmarques.com.br/?p=451</guid>
		<description><![CDATA[Olá pessoal, Faz tempo que não passo por aqui, e põem tempo nisso. Para que o blog não fique sem atualizações por minha falta de tempo para elaborar artigos maiores, irei inaugurar com esse post um série de mini posts, que vão servir para tirar algumas dúvidas ou ajudar em uma coisinha ou outra, ou [...]]]></description>
			<content:encoded><![CDATA[<p>Olá pessoal,</p>
<p>Faz tempo que não passo por aqui, e põem tempo nisso.</p>
<p>Para que o blog não fique sem atualizações por minha falta de tempo para elaborar artigos maiores, irei inaugurar com esse post um série de mini posts, que vão servir para tirar algumas dúvidas ou ajudar em uma coisinha ou outra, ou seja, de acordo que eu aprenda algo novo posto por aqui e compartilho, sei que as vezes não vai ser novidade mais vai ajudar alguém isso garanto. ;D<span id="more-451"></span></p>
<p>Então vamos um dica simples e que precisei esses dias foi alterar o nome do computador no Ubuntu, abaixo segue o código.</p>
<p>Vá no terminal Shell e digite o seguinte comando:</p>
<pre class="brush: bash; title: ; notranslate">
 sudo vi /etc/hostname
</pre>
<p>O comando acima vai abrir o arquivo para edição, é bem provável que solicite a sua senha, então a digite.</p>
<p>Depois ao exibir o arquivo você verá o nome do computador ai basta apertar a tecla &#8220;i&#8221;(insert) e ir até a linha e editar o nome depois, aperte a tecla ESC e em seguida escreva</p>
<pre class="brush: bash; title: ; notranslate">:wq!</pre>
<p>Depois disso basta reiniciar o servidor, basta usar o comando abaixo</p>
<pre class="brush: bash; title: ; notranslate">sudo reboot</pre>
<p>Pronto!</p>
<p>Agora você conseguiu mudar o nome do servidor =D</p>
]]></content:encoded>
			<wfw:commentRss>http://www.johnmarques.com.br/linux/alterando-o-nome-do-computador-no-ubuntu/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Como salvar apenas o seu e-mail no Messenger 2011</title>
		<link>http://www.johnmarques.com.br/dicas/como-salvar-apenas-o-seu-e-mail-no-messenger-2011/</link>
		<comments>http://www.johnmarques.com.br/dicas/como-salvar-apenas-o-seu-e-mail-no-messenger-2011/#comments</comments>
		<pubDate>Mon, 20 Dec 2010 14:38:07 +0000</pubDate>
		<dc:creator>Christian Borchardt</dc:creator>
				<category><![CDATA[Dicas]]></category>
		<category><![CDATA[Windows]]></category>
		<category><![CDATA[2011]]></category>
		<category><![CDATA[e-mail]]></category>
		<category><![CDATA[email]]></category>
		<category><![CDATA[login]]></category>
		<category><![CDATA[messenger]]></category>
		<category><![CDATA[msn]]></category>

		<guid isPermaLink="false">http://www.johnmarques.com.br/?p=418</guid>
		<description><![CDATA[A algum tempo instalei o Messenger 2011, a versão mais nova prometia muito e realmente ela é bem bacana. Mas houveram algumas mudanças em nome da inovação. Umas delas é que não existe a opção de salvar apenas o seu e-mail na tela de login do Messenger. Isso é realmente muito chato, todas as vezes [...]]]></description>
			<content:encoded><![CDATA[<p>A algum tempo instalei o Messenger 2011, a versão mais nova prometia muito e realmente ela é bem bacana.<br />
Mas houveram algumas mudanças em nome da inovação. Umas delas é que não existe a opção de salvar apenas o seu e-mail na tela de login do Messenger.<br />
Isso é realmente muito chato, todas as vezes que você quer entrar no Messenger tem que digitar seu email e depois a senha.<br />
Corri&#8230; estudei&#8230; tentei&#8230; tentei&#8230; tentei&#8230; e consegui!<span id="more-418"></span><br />
Então, vamos ao que interessa:</p>
<p>1º &#8211; Abra o Messenger<br />
Digite seu e-mail e sua senha, marque a caixa (Lembrar minhas ID e senha)<br />
Desmarque a caixa (Entrar automaticamente)<br />
Agora clique em (ENTRAR) para logar no Messenger<br />
<a href="http://www.johnmarques.com.br/wp-content/uploads/2010/12/johnmarques-mess-t01.jpg" rel="lightbox[418]"><img class="alignnone size-medium wp-image-419" src="http://www.johnmarques.com.br/wp-content/uploads/2010/12/johnmarques-mess-t01-300x168.jpg" alt="" width="300" height="168" /></a></p>
<p>2º &#8211; Abra o Gerenciador de credenciais<br />
Com o Messenger ainda aberto, clique em iniciar e na caixa de pesquisa busque pela palavra &#8220;credenciais&#8221;.<br />
Abra o programa chamado, (Gerenciar credenciais do Windows)<br />
<a href="http://www.johnmarques.com.br/wp-content/uploads/2010/12/johnmarques-mess-t02.jpg" rel="lightbox[418]"><img class="alignnone size-medium wp-image-420" src="http://www.johnmarques.com.br/wp-content/uploads/2010/12/johnmarques-mess-t02-300x168.jpg" alt="" width="300" height="168" /></a></p>
<p>3º &#8211; Excluindo a senha salva<br />
Após abrir o (Gerenciador de credenciais do Windows)&#8230;<br />
Procure pelo seu e-mail na lista &#8220;Credenciais Genéricas&#8221;<br />
Clique sobre o seu e-mail e então serão exibidas informações adicionais sobre seu e-mail<br />
Clique no botão &#8220;Editar&#8221;<br />
Deve aparecer uma tela com seu e-mail e sua senha<br />
Apenas apague sua senha e depois clique em &#8220;Salvar&#8221;<br />
<a href="http://www.johnmarques.com.br/wp-content/uploads/2010/12/johnmarques-mess-t03.jpg" rel="lightbox[418]"><img class="alignnone size-medium wp-image-421" src="http://www.johnmarques.com.br/wp-content/uploads/2010/12/johnmarques-mess-t03-300x168.jpg" alt="" width="300" height="168" /></a></p>
<p><a href="http://www.johnmarques.com.br/wp-content/uploads/2010/12/johnmarques-mess-t04.jpg" rel="lightbox[418]"><img class="alignnone size-medium wp-image-422" src="http://www.johnmarques.com.br/wp-content/uploads/2010/12/johnmarques-mess-t04-300x168.jpg" alt="" width="300" height="168" /></a></p>
<p><a href="http://www.johnmarques.com.br/wp-content/uploads/2010/12/johnmarques-mess-t05.jpg" rel="lightbox[418]"><img class="alignnone size-medium wp-image-423" src="http://www.johnmarques.com.br/wp-content/uploads/2010/12/johnmarques-mess-t05-300x168.jpg" alt="" width="300" height="168" /></a></p>
<p>4º &#8211; Verificando<br />
Agora, feche completamente o Messenger.<br />
Pronto, abra e verifique que seu e-mail ficou salvo!</p>
<p>Você pode fazer o mesmo processo com vários e-mails diferentes.<br />
Mas atenção, não mecha em outras configurações do (Gerenciador de credenciais do Windows) sob risco de danificar o funcionamento de outros programas.</p>
<p>Até a próxima!</p>
<div class="awmp_tags"><a href="http://www.johnmarques.com.br/search/messenger/" rel="tag">messenger</a> <a href="http://www.johnmarques.com.br/search/2011/" rel="tag">2011</a> <a href="http://www.johnmarques.com.br/search/email/" rel="tag">email</a> <a href="http://www.johnmarques.com.br/search/e-mail/" rel="tag">e-mail</a> <a href="http://www.johnmarques.com.br/search/salvar/" rel="tag">salvar</a> <a href="http://www.johnmarques.com.br/search/login/" rel="tag">login</a> <a href="http://www.johnmarques.com.br/search/msn/" rel="tag">msn</a></div>]]></content:encoded>
			<wfw:commentRss>http://www.johnmarques.com.br/dicas/como-salvar-apenas-o-seu-e-mail-no-messenger-2011/feed/</wfw:commentRss>
		<slash:comments>41</slash:comments>
		</item>
		<item>
		<title>Controle de Acesso com Zend_Acl</title>
		<link>http://www.johnmarques.com.br/php/controle-de-acesso-com-zend_acl/</link>
		<comments>http://www.johnmarques.com.br/php/controle-de-acesso-com-zend_acl/#comments</comments>
		<pubDate>Wed, 01 Dec 2010 19:36:13 +0000</pubDate>
		<dc:creator>John Marques</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Zend Framework]]></category>
		<category><![CDATA[Funcionalidade]]></category>
		<category><![CDATA[Perfil]]></category>
		<category><![CDATA[Permissão]]></category>
		<category><![CDATA[Permission]]></category>
		<category><![CDATA[Permissões]]></category>
		<category><![CDATA[Prefils]]></category>
		<category><![CDATA[Resource]]></category>
		<category><![CDATA[Role]]></category>
		<category><![CDATA[Zend]]></category>
		<category><![CDATA[Zend_Acl]]></category>
		<category><![CDATA[Zend_Auth]]></category>

		<guid isPermaLink="false">http://www.johnmarques.com.br/?p=400</guid>
		<description><![CDATA[Olá pessoal, Hoje iremos falar sobre como criar o controle de acesso para os usuários no sistema, ou seja as permissões que o usuário possui baseado em seu perfil dentro do sistema. A ACL é composta de três funções básicas, são elas: Perfil (Role) Eu entendo como nível, como se fosse em um hierarquia, é [...]]]></description>
			<content:encoded><![CDATA[<p>Olá pessoal,</p>
<p>Hoje iremos falar sobre como criar o controle de acesso para os usuários no sistema, ou seja as permissões que o usuário possui baseado em seu perfil dentro do sistema.<span id="more-400"></span></p>
<p>A ACL é composta de três funções básicas, são elas:</p>
<p><strong>Perfil (Role)<br />
</strong>Eu entendo como nível, como se fosse em um hierarquia, é de acordo  com o perfil do usuário, que ele terá acesso as funcionalidades do  sistema.<br />
<em>Ex.: Administrador, Técnico, e etc..</em></p>
<p><strong>Funcionalidades (Resource)<br />
</strong>São as funções que você disponíbiliza, ou seja, adicionar, editar, excluir, listar entre outros.</p>
<p><strong>Permissões (Permissions)<br />
</strong>Rs, esse acho que nem preciso falar, mas é a ligação entre o perfil e funcionalidade, é onde determino qual funcionalidade o perfil terá ou não acesso.</p>
<p>Então vamos começar o código! (Até que enfim! \0/)</p>
<p>No meu caso eu criei um plugin, mas acredito que possa ser adaptado a ACL e colocada dentro do Bootstrap.</p>
<p>Iremos  por parte, primeiramente vamos criar a classe e instânciar o Zend_Acl.</p>
<pre class="brush: php; title: ; notranslate">
&lt;?php
class Application_Plugin_ACL extends Zend_Controller_Plugin_Abstract
{
    private $acl;

    public function __construct()
    {
        // Instânciamos a ACL
        $this-&gt;acl = new Zend_Acl();
    }

    public function preDispatch(Zend_Controller_Request_Abstract $request)
    {
    }
}
?&gt;
</pre>
<p>Agora vamos criar dois perfis para os usuários.</p>
<ul>
<li>admin = administrador do sistema</li>
<li>operador = Usuário comum do sistema</li>
</ul>
<p>na prática</p>
<pre class="brush: php; title: ; notranslate">
&lt;?php
class Application_Plugin_ACL extends Zend_Controller_Plugin_Abstract
{
    private $acl;

    public function __construct()
    {
        // Instânciamos a ACL
        $this-&gt;acl = new Zend_Acl();

        // Criando os perfis
        $this-&gt;acl-&gt;addRole(new Zend_Acl_Role('operador')) //Operador
                  -&gt;addRole(new Zend_Acl_Role('admin')); // Administrador&lt;/pre&gt;
}

 public function preDispatch(Zend_Controller_Request_Abstract $request)
 {
 }
}
?&gt;
</pre>
<p>Agora que criamos os perfis, vamos determinar as funcionalidades do sistema.</p>
<pre class="brush: php; title: ; notranslate">
&lt;?php
class Application_Plugin_ACL extends Zend_Controller_Plugin_Abstract
{
    private $acl;

    public function __construct()
    {
        // Instânciamos a ACL
        $this-&gt;acl = new Zend_Acl();

        // Criando os perfis
        $this-&gt;acl-&gt;addRole(new Zend_Acl_Role('operador')) //Operador
                  -&gt;addRole(new Zend_Acl_Role('admin')); // Administrador

        // Funcionalidades
        // Definicao modulo:controller, action
        $this-&gt;acl-&gt;add(new Zend_Acl_Resource('default:auth', 'logout')) // Para sair do sistema
                  -&gt;add(new Zend_Acl_Resource('default:users')) // Cadastro de usuarios
                  -&gt;add(new Zend_Acl_Resource('default:noticias')); // Cadastro de notícias&lt;/pre&gt;
 }

 public function preDispatch(Zend_Controller_Request_Abstract $request)
 {

 }
}
?&gt;
</pre>
<p>Agora já está quase pronto, vamos pra o próximo passo, definir as permissões dentro da ACL.</p>
<pre class="brush: php; title: ; notranslate">
&lt;?php
class Application_Plugin_ACL extends Zend_Controller_Plugin_Abstract
{
    private $acl;

    public function __construct()
    {
        // Instânciamos a ACL
        $this-&gt;acl = new Zend_Acl();

        // Criando os perfis
        $this-&gt;acl-&gt;addRole(new Zend_Acl_Role('operador')) //Operador
                  -&gt;addRole(new Zend_Acl_Role('admin')); // Administrador

        // Funcionalidades
        // Definicao modulo:controller, action
        $this-&gt;acl-&gt;add(new Zend_Acl_Resource('default:auth', 'logout')) // Para sair do sistema
                  -&gt;add(new Zend_Acl_Resource('default:users')) // Cadastro de usuarios
                  -&gt;add(new Zend_Acl_Resource('default:noticias')); // Cadastro de notícias

        // Definir as permissões
        // perfil, modulo:controller, action
        // Metódo allow é de permissão
        // Metódo deny é de negação

        // Perfil: Operador
        $this-&gt;acl-&gt;allow('operador', 'default:auth', 'logout') // Tem que permitir que cara saia não é mesmo, ah não ser que o perfil seja prisioneiro ai não ehaueshuase =D
                  -&gt;allow('operador', 'default:noticias', array('index', 'edit')) // Definer por ações, vamos dizer que o cara so possa listar e editar
                  -&gt;deny('operador', 'default:noticias', 'delete') // e não permitir ele excluir a notícia
                  -&gt;deny('default:users') //não vamos permitir que o operador administre os usuários

        // Perfil: Admin
        // E para o admin tudo =D
                  -&gt;allow('admin', 'default:auth', 'logout')
                  -&gt;allow('admin', 'default:noticias')
                  -&gt;allow('admin', 'default:users');

}

 public function preDispatch(Zend_Controller_Request_Abstract $request)
 {

 }
}
?&gt;
</pre>
<p>Agora que já foram definidos os perfis, funcionalidades e permissões, falta apenas fazer a verificação e pronto! =D</p>
<pre class="brush: php; title: ; notranslate">
&lt;?php
class Application_Plugin_ACL extends Zend_Controller_Plugin_Abstract
{
    private $acl;

    public function __construct()
    {
        // Instânciamos a ACL
        $this-&gt;acl = new Zend_Acl();

        // Criando os perfis
        $this-&gt;acl-&gt;addRole(new Zend_Acl_Role('operador')) //Operador
                  -&gt;addRole(new Zend_Acl_Role('admin')); // Administrador

        // Funcionalidades
        // Definicao modulo:controller, action
        $this-&gt;acl-&gt;add(new Zend_Acl_Resource('default:auth', 'logout')) // Para sair do sistema
                  -&gt;add(new Zend_Acl_Resource('default:users')) // Cadastro de usuarios
                  -&gt;add(new Zend_Acl_Resource('default:noticias')); // Cadastro de notícias

        // Definir as permissões
        // perfil, modulo:controller, action
        // Metódo allow é de permissão
        // Metódo deny é de negação

        // Perfil: Operador
        $this-&gt;acl-&gt;allow('operador', 'default:auth', 'logout') // Tem que permitir que cara saia não é mesmo, ah não ser que o perfil seja prisioneiro ai não ehaueshuase =D
                  -&gt;allow('operador', 'default:noticias', array('index', 'edit')) // Definer por ações, vamos dizer que o cara so possa listar e editar
                  -&gt;deny('operador', 'default:noticias', 'delete') // e não permitir ele excluir a notícia
                  -&gt;deny('default:users') //não vamos permitir que o operador administre os usuários

        // Perfil: Admin
        // E para o admin tudo =D
                  -&gt;allow('admin', 'default:auth', 'logout')
                  -&gt;allow('admin', 'default:noticias')
                  -&gt;allow('admin', 'default:users');
  }

 public function preDispatch(Zend_Controller_Request_Abstract $request)
 {
 // Primeiro vamos instânciar o Zend_Auth
 $auth = Zend_Auth::getInstance();
 // Agora vamos descobri qual o modulo, controller e action que o usuário está acessando
 $module = $request-&gt;getModuleName();
 $controller = $request-&gt;getControllerName();
 $action = $request-&gt;getActionName();

 /* Agora que já capturamos a ação do usuário, vamos verificar se o usuário está logado, caso esteja vamos verificar se ele tem acesso a funcionalidade */
 if($auth-&gt;hasIdentity()) {
 // Beleza o cabra ta logado, agora vamos ver se ele tem permissão
 $identity = $auth-&gt;getIdentity();

 if(!$this-&gt;acl-&gt;isAllowed($identity-&gt;perfil, $module.':'.$controller, $action)) {
 /* Agora é so direcionar para outra página ou gerar o erro, eu faço o seguinte seto o controller de error e ação forbidden que é o erro 403, ficando assim.*/
 $request-&gt;setControllerName('error')-&gt;setActionName('forbidden');
 }
 }
 }
}
?&gt;
</pre>
<p>É isso ai pessoal, espero que tenham gostado o próximos artigos serão sobre Zend_Navigation para criar menus e depois a integração do Zend_Navigation com o Zend_Acl para que o usuário visualize somente o menu que tem direito.</p>
<p>Então abraço a todos,</p>
<p>John Marques</p>
]]></content:encoded>
			<wfw:commentRss>http://www.johnmarques.com.br/php/controle-de-acesso-com-zend_acl/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Gerando cache com Smarty</title>
		<link>http://www.johnmarques.com.br/php/gerando-cache-com-smarty/</link>
		<comments>http://www.johnmarques.com.br/php/gerando-cache-com-smarty/#comments</comments>
		<pubDate>Thu, 11 Nov 2010 15:11:40 +0000</pubDate>
		<dc:creator>John Marques</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Smarty]]></category>
		<category><![CDATA[cache]]></category>
		<category><![CDATA[caching]]></category>

		<guid isPermaLink="false">http://www.johnmarques.com.br/?p=387</guid>
		<description><![CDATA[Olá Pessoal, Hoje vamos falar sobre Smarty, um sistema de templates para PHP, mais especificamente iremos falar sobre como gerar cache como Smarty. Decide postar sobre esse assunto, pois estou trabalhando com um site que vem dando dor de cabeça para seu dono, pois o grande número de acessos ao site, faz com que o [...]]]></description>
			<content:encoded><![CDATA[<p>Olá Pessoal,</p>
<p>Hoje vamos falar sobre <a href="http://www.smarty.net" target="_blank">Smarty</a>, um sistema de templates para PHP, mais especificamente iremos falar sobre como gerar cache como Smarty.</p>
<p>Decide postar sobre esse assunto, pois estou trabalhando com um site que vem dando dor de cabeça para seu dono, pois o grande número de acessos ao site, faz com que o processamento e número de requisições ao banco seja bem alto, deixando o site mais lento.<span id="more-387"></span></p>
<p>Mas a ideia de usar o Cache nesse site é por que, por conta dessa performance o site já foi retirado do ar por vários hospedeiros, pois consome muito processamento do servidor de hospedagem, ai o dono do site, tem que ficar migrando de servidor em servidor até achar um que suporte de fato.</p>
<p>Então se não usa &#8220;WordPress com aquele plugin WP Super Cache&#8221;, e quer da um melhorada na performance do site, veja abaixo um resumo sobre como usar o cache do Smarty. =D</p>
<p><em>Vantagens de se usar o cache</em><strong><br />
</strong></p>
<ul>
<li>Diminuir o processamento</li>
<li>Diminuir o número de requisições ao banco de dados</li>
</ul>
<p><em>Desvantagens de se usar o cache</em><strong><br />
</strong></p>
<ul>
<li>Administração dos arquivos de cache</li>
</ul>
<p><strong>Instalando o Smarty</strong></p>
<p>Faça primeiramente o download da versão estável da biblioteca do Smarty no seguinte link <a href="http://www.smarty.net/do_download.php?download_file=Smarty-2.6.26.zip">http://www.smarty.net/do_download.php?download_file=Smarty-2.6.26.zip</a>,  depois extraia o o arquivo e zip e copie a pasta do Smarty para a pasta do seu site.</p>
<p><a href="http://www.johnmarques.com.br/wp-content/uploads/2010/11/smarty-01.jpg" rel="lightbox[387]"><img class="size-full wp-image-390 alignnone" title="smarty-01" src="http://www.johnmarques.com.br/wp-content/uploads/2010/11/smarty-01.jpg" alt="" width="400" height="211" /></a></p>
<p>Crie as seguintes</p>
<table>
<tbody>
<tr>
<td><strong>tpl_cache</strong></td>
<td>Irá armazenar os arquivos de cache</td>
</tr>
<tr>
<td><strong>tpl_compiler</strong></td>
<td>Irá armazenar as templates compiladas</td>
</tr>
<tr>
<td><strong>tpl_configs</strong></td>
<td>Irá armazenar os arquivos de configuração</td>
</tr>
<tr>
<td><strong>tpl_files</strong></td>
<td>Irá armazenar as templates</td>
</tr>
</tbody>
</table>
<p><em>Essa estrutura não é obrigatória! Você pode fazer como achar que melhor adequado, o importante é que se sete os caminhos corretamente, logo abaixo veremos como.</em></p>
<p><a href="http://www.johnmarques.com.br/wp-content/uploads/2010/11/smarty-02.jpg" rel="lightbox[387]"><img class="alignnone size-full wp-image-391" title="smarty-02" src="http://www.johnmarques.com.br/wp-content/uploads/2010/11/smarty-02.jpg" alt="" width="400" height="106" /></a></p>
<p>Agora vamos para  o código. \0/</p>
<p>Primeiro vamos criar o arquivo <strong><em>index.tpl</em></strong> na pasta <strong><em>tpl_files</em></strong>, será a template do arquivo inicial.</p>
<pre class="brush: xml; title: ; notranslate">
&lt;html&gt;
&lt;head&gt;
&lt;title&gt;&lt;strong&gt;{$titulo}&lt;/strong&gt;&lt;/title&gt;
&lt;/head&gt;
&lt;body topmargin=&quot;0&quot; leftmargin=&quot;0&quot; rigthmargin=&quot;0&quot;&gt;
&lt;table width=&quot;100%&quot; border=&quot;0&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot;&gt;
&lt;tr&gt;
&lt;td height=&quot;50&quot;&gt;
&lt;strong&gt;{$nome}&lt;/strong&gt;, seja bem vindo ao site &lt;strong&gt;{$site}&lt;/strong&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/body&gt;
&lt;/html&gt;
</pre>
<p>Agora vamos para o arquivo <em><strong>index.php</strong></em>, que irá chamar o Smarty e fazer o trabalho com cache.</p>
<pre class="brush: php; title: ; notranslate">
// Include a classe do Smarty
require_once('Smarty-2.6.26/libs/Smarty.class.php');

// Caminho da pasta do site
define('PATH_ROOT', dirname(__FILE__));

// Instância o objeto
$smarty = new Smarty();
// Configurando os caminhos das pasta para o smarty
$smarty-&gt;template_dir = PATH_ROOT . '/tpl_files';
$smarty-&gt;compile_dir = PATH_ROOT . '/tpl_compiler';
$smarty-&gt;cache_dir = PATH_ROOT . '/tpl_cache';
$smarty-&gt;config_dir = PATH_ROOT . '/tpl_configs';

// Define que o Smarty irá utilizar cache
// Opção 1 : Diz para o Smarty que ele deve utilizar o tempo de vida, definido na configuração do Smarty
// Opção 2 : Diz para o Smarty que ele deve utilizar o tempo de vida, definido no arquivo de cache
$smarty-&gt;caching = 2;

// O Smarty já define o tempo de vida do cache de uma hora,
// mas podemos alterar. Lembrando que o tempo é em segundos
$smarty-&gt;cache_lifetime = 86400; // 1 dia

// Agora vamos verificar se existe um arquivo de cache
// Caso não exista ele passa os dados para a template
if(!$smarty-&gt;is_caching('index.tpl')) {
   $smarty-&gt;assign(array(
      'titulo' =&gt; 'John Marques.com.br - Gerando cache com Smarty',
      'nome' =&gt; 'Fulano',
      'site' =&gt; 'www.johnmarques.com.br'
   ));
}

// Exibe a template
$smarty-&gt;display('index.tpl');
</pre>
<p>Seguinte no arquivo <em><strong>index.php, </strong></em>o cache só é excluído e gerado um novo quando o arquivo de cache expira, caso contrário ele exibe o arquivo de cache.</p>
<p>Agora para você excluir um arquivo de cache é simples, abaixo está o código =D</p>
<pre class="brush: php; title: ; notranslate">
// Exclui o arquivo de cache da template index.tpl
$smarty-&gt;clear_cache('index.tpl');
// Exclui todos os arquivos de cache
$smarty-&gt;clear_all_cache();
</pre>
<p>Agora vamos dizer que precise de vários arquivos de cache para uma mesma template, ai você vai dizer pra que John, ai eu digo, imagine um sistema de notícias, podemos criar um cache para cada noticia. =D</p>
<p>Como?</p>
<p>Agora mostro como ! =D</p>
<pre class="brush: php; title: ; notranslate">
// ID da notícia
$noticia_id = $_GET['id'];

//No momento em que se verifica se existe o arquivo de cache passe o segundo parâmentro do método, que é a identifição do chace ou $cache_id.
// O mesmo deve se fazer no display
if(!$smarty-&gt;is_caching('noticia.tpl', $noticia_id)) {
   // busca os dados na notítica
}

// Exibe a template
$smarty-&gt;display('noticia.tpl', $noticia_id);

// Para excluir basta informa o cache_id
$smarty-&gt;clear_cache('noticia.tpl', $noticia_id);
// ou limpar todos
$smarty-&gt;clear_all_cache();
</pre>
<p>Perceba que ele irá criar um arquivo de cache para cada notícia que você visualizar.</p>
<p>É isso ai, espero que tenham gostado do arquivo, e que isso possa ajudar a otimizar a performance dos sites que você produzirem.</p>
<p>Para saber mais sobre a documentação do Smarty acesse <a href="http://www.smarty.net/manual/pt_BR/">http://www.smarty.net/manual/pt_BR/</a>.</p>
<p>Então até a próxima.</p>
<p>Abraços,</p>
<p>John Marques</p>
]]></content:encoded>
			<wfw:commentRss>http://www.johnmarques.com.br/php/gerando-cache-com-smarty/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Zend Framework &#8211; Plugin para verificar se o usuário está logado</title>
		<link>http://www.johnmarques.com.br/php/zend-framework-plugin-para-verificar-se-o-usuario-esta-logado/</link>
		<comments>http://www.johnmarques.com.br/php/zend-framework-plugin-para-verificar-se-o-usuario-esta-logado/#comments</comments>
		<pubDate>Fri, 05 Nov 2010 20:32:00 +0000</pubDate>
		<dc:creator>John Marques</dc:creator>
				<category><![CDATA[Destaque]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Zend Framework]]></category>
		<category><![CDATA[plugin]]></category>
		<category><![CDATA[Zend]]></category>

		<guid isPermaLink="false">http://www.johnmarques.com.br/?p=375</guid>
		<description><![CDATA[Olá Pessoal, Estou a um tempo me dedicando ao Zend Framework, por que acredito ser um boa escolha na questão de tempo e nível de desenvolvimento e até o momento não me arrependo da escolha de aprender, tenho volta e meia dificuldade, mas acontece não é mesmo, da mesma forma quando aprendemos a dirigir, andar [...]]]></description>
			<content:encoded><![CDATA[<p>Olá Pessoal,</p>
<p>Estou a um tempo me dedicando ao Zend Framework, por que acredito ser um boa escolha na questão de tempo e nível de desenvolvimento e até o momento não me arrependo da escolha de aprender, tenho volta e meia dificuldade, mas acontece não é mesmo, da mesma forma quando aprendemos a dirigir, andar de bicicleta no começo e difícil e depois vai melhorando com a prática. =D</p>
<p>Mas então, hoje vou mostar um plugin simples, que vai facilitar bastante, ele serve para verificar se o usuário está logado ou não, caso não esteja direciona para a tela de login.<span id="more-375"></span></p>
<p>Para que você não tenha que colocar a verificação em todo metodo <strong>init</strong> de seus controladores.</p>
<p>Esse plugin é ideal para você utilizar no sistema de administração do site.</p>
<p>Então vamos lá ao código!</p>
<p>No meu caso a pasta de plugins fica dentro da pasta application então seria mais ou menos assim.</p>
<p>application/plugins/HasIdentity.php</p>
<pre class="brush: php; title: ; notranslate">
class Application_Plugin_HasIdentity extends Zend_Controller_Plugin_Abstract
{
   /*
    Nome do módulo, controlador e ação que o usuário terá acesso caso não esteja logado.
    */
   const module      = 'admin';
   const controller  = 'auth';
   const action      = 'login';

   public function preDispatch(Zend_Controller_Request_Abstract $request)
   {
      $module     = $request-&gt;getModuleName();
      $controller = $request-&gt;getControllerName();
      $action     = $request-&gt;getActionName();

      // Verifica se o usuário não está logado
      if(!Zend_Auth::getInstance()-&gt;hasIdentity()) {
         // Verifica se a requisição é diferente do permitido
         // Se for diferente rotea para a página de login
         if($module != self::module &amp;&amp; $controller != self::controller &amp;&amp; $action != self::action) {
            $request-&gt;setModuleName(self::module);
            $request-&gt;setControllerName(self::controller);
            $request-&gt;setActionName(self::action);
         }
      }
   }
}
</pre>
<p>Ai depois é so registrar o plugin no meu caso uso no bootstrap ficando assim.</p>
<pre class="brush: php; title: ; notranslate">
public function _initPlugins()
{
   $frontController = Zend_Controller_Front::getInstance();
   $frontController-&gt;registerPlugin(new Application_Plugin_HasIdentity());
}
</pre>
<p>Pronto! Agora que você registrou o plugin só atualizar a página e experimentar. =D</p>
<p>Abraços,</p>
<p>John Marques</p>
]]></content:encoded>
			<wfw:commentRss>http://www.johnmarques.com.br/php/zend-framework-plugin-para-verificar-se-o-usuario-esta-logado/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Zend Framework &#8211; Traduzindo as mensagens de validação para pt_BR</title>
		<link>http://www.johnmarques.com.br/php/zf-traduzindo-as-mensagens-de-validacao-para-pt_br/</link>
		<comments>http://www.johnmarques.com.br/php/zf-traduzindo-as-mensagens-de-validacao-para-pt_br/#comments</comments>
		<pubDate>Thu, 21 Oct 2010 14:32:14 +0000</pubDate>
		<dc:creator>John Marques</dc:creator>
				<category><![CDATA[Destaque]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Zend Framework]]></category>
		<category><![CDATA[Zend]]></category>
		<category><![CDATA[Zend_Form]]></category>
		<category><![CDATA[Zend_Translate]]></category>

		<guid isPermaLink="false">http://www.johnmarques.com.br/?p=335</guid>
		<description><![CDATA[Olá pessoal, olha nós aqui de novo =D, hoje vou mostrar como traduzir as mensagens de validação do Zend, primeiro baixe a versão full do zend, eu utilizo 1.10. Não vou ensinar como fazer a instalação e configuração do Zend Framework por que existem diversos posts falando sobre isso, então é só dar um googada. [...]]]></description>
			<content:encoded><![CDATA[<p>Olá pessoal,</p>
<p>olha nós aqui de novo =D, hoje vou mostrar como traduzir as mensagens de validação do Zend, primeiro baixe a versão <a href="http://framework.zend.com/download/latest">full</a> do zend, eu utilizo 1.10.<span id="more-335"></span></p>
<p>Não vou ensinar como fazer a instalação e configuração do Zend Framework por que existem diversos posts falando sobre isso, então é só dar um googada. =D</p>
<p>Depois de descompactado seu arquivo na pasta &#8220;resources&#8221;, existe a pasta &#8220;languages&#8221;, copie essa pasta para a pasta &#8220;application&#8221;.</p>
<p>Agora vamos ao código, no arquivo Bootstrap.php, insira o seguinte método.</p>
<pre class="brush: php; title: ; notranslate">

protected function _initTranslate()
 {
 try {
 $translate = new Zend_Translate('Array', APPLICATION_PATH . '/languages/pt_BR/Zend_Validate.php', 'pt_BR');
 Zend_Validate_Abstract::setDefaultTranslator($translate);
 } catch(Exception $e) {
 die($e-&gt;getMessage());
 }
 }
</pre>
<p>Pronto! =D</p>
<p>Agora basta criar o formulário e fazer a validação =D</p>
<div class="awmp_tags"><a href="http://www.johnmarques.com.br/search/Zend_Form/" rel="tag">Zend_Form</a> <a href="http://www.johnmarques.com.br/search/Zend_Translate/" rel="tag">Zend_Translate</a></div>]]></content:encoded>
			<wfw:commentRss>http://www.johnmarques.com.br/php/zf-traduzindo-as-mensagens-de-validacao-para-pt_br/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Classe TwitterStatuses &#8211; Atualizando e Retornando Tweets</title>
		<link>http://www.johnmarques.com.br/php/classe-twitterstatuses-atualizando-e-retornando-tweets/</link>
		<comments>http://www.johnmarques.com.br/php/classe-twitterstatuses-atualizando-e-retornando-tweets/#comments</comments>
		<pubDate>Thu, 26 Aug 2010 15:36:31 +0000</pubDate>
		<dc:creator>John Marques</dc:creator>
				<category><![CDATA[Destaque]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[cURL]]></category>
		<category><![CDATA[twitter]]></category>
		<category><![CDATA[update]]></category>
		<category><![CDATA[user_timeline]]></category>

		<guid isPermaLink="false">http://www.johnmarques.com.br/?p=310</guid>
		<description><![CDATA[Olá Pessoal, Quanto tempo heim? Pois então hoje estava mexendo com um classe para fazer interação com o Twitter sem o usar autenticação via oAuth, então fiz em cURL, e gostaria de compartilhar com vocês. =D Achei dois artigos na internet que me ajudarão a fazer, no fim passo a referência. Então vamos lá! Arquivo:  [...]]]></description>
			<content:encoded><![CDATA[<p>Olá Pessoal,</p>
<p>Quanto tempo heim?</p>
<p>Pois então hoje estava mexendo com um classe para fazer interação com o Twitter sem o usar autenticação via oAuth, então fiz em<a href="http://php.net/manual/en/book.curl.php" target="_blank"> cURL</a>, e gostaria de compartilhar com vocês. =D</p>
<p>Achei dois artigos na internet que me ajudarão a fazer, no fim passo a referência.</p>
<p>Então vamos lá!<span id="more-310"></span></p>
<p>Arquivo:  TwitterStatuses.php</p>
<pre class="brush: php; title: ; notranslate">
&lt;?php
/**
 * Classe de manipulação do status do usuário no Twitter
 *
 * @author John Marques
 *            john@webcomcafe.com.br
 */
class TwitterStatuses
{
 /**
 * Usuário do Twitter
 * @var string
 */
 private $username;

 /**
 * Senha do usuário do Twitter
 * @var mixed
 */
 private $password;

 /**
 * Usuário e Senha já formato para o CURL
 * @var mixed
 */
 private $userpwd;

 /**
 * Vetor com as url que servirão para interagir com o Twitter
 * @var array
 */
 private $url = array(
 'update'         =&gt; &quot;http://TwitterStatuses.com/statuses/update.xml&quot;,
 'user_timeline' =&gt; &quot;http://TwitterStatuses.com/statuses/user_timeline.xml&quot;
 );

 /**
 * Seta os valores dos membros da classe
 * @param string $username
 * @param string $password
 */
 public function __construct($username, $password = '')
 {
 self::setUsername($username);

 if($username != '' &amp;&amp; $password != '')
 {
 self::setPassword($password);
 }
 }

 /**
 * Seta o valor do membro $username
 * @param string $value
 */
 public function setUsername($value)
 {
 $this-&gt;username = $value;
 }

 /**
 * Seta o valor do membro $password
 * @param string $value
 */
 public function setPassword($value)
 {
 $this-&gt;password = $value;
 $this-&gt;userpwd  = $username . ':' . $value;
 }

 /**
 * Atualiza o status do perfil do usuário no TwitterStatuses
 * @param string $message
 */
 public function update($message)
 {
 if($this-&gt;userpwd == '') {
 trigger_error(&quot;O membro \$userpwd não pode ser nulo.&quot;, E_USER_ERROR);
 return false;
 }

 $curl_handle = curl_init();
 curl_setopt($curl_handle, CURLOPT_URL, $this-&gt;url['update']);
 curl_setopt($curl_handle, CURLOPT_CONNECTTIMEOUT, 2);
 curl_setopt($curl_handle, CURLOPT_RETURNTRANSFER, 1);
 curl_setopt($curl_handle, CURLOPT_POST, 1);
 curl_setopt($curl_handle, CURLOPT_POSTFIELDS, &quot;status=$message&quot;);
 curl_setopt($curl_handle, CURLOPT_USERPWD, $this-&gt;userpwd);
 $buffer = curl_exec($curl_handle);
 curl_close($curl_handle);

 $ResponseXML = simplexml_load_string($buffer);

 if(isset($ResponseXML-&gt;error) &amp;&amp; $ResponseXML-&gt;error != '') {
 return false;
 } else {
 return true;
 }
 }

 /**
 * Retorna os últimos tweets do usuário no TwitterStatuses, não é necessário logar
 */
 public function user_timeline()
 {
 $curl_handle = curl_init();
 curl_setopt($curl_handle, CURLOPT_URL, $this-&gt;url['user_timeline'] . '?screen_name=' . $this-&gt;username);
 curl_setopt($curl_handle, CURLOPT_HEADER, 1);
 curl_setopt($curl_handle, CURLOPT_TIMEOUT, 30);
 curl_setopt($curl_handle, CURLOPT_RETURNTRANSFER, 1);
 $buffer = curl_exec($curl_handle);
 curl_close($curl_handle);
 // Encontra a primeira ocorrência de &lt;?, para que se retorne somente o xml
 $data = strstr($buffer, '&lt;?');
 // Interpreta o xml e transforma em objeto
 $ResponseXML = simplexml_load_string($data);

 if(isset($ResponseXML-&gt;error) &amp;&amp; $ResponseXML-&gt;error != '') {
 return false;
 } else {
 // Retorna os status como vetor
 return $ResponseXML-&gt;status;
 }
 }
}
?&gt;
</pre>
<p>A classe possui  cinco métodos,  são eles:</p>
<ul>
<li><strong>__construct( $username, $password = &#8221; )</strong>;<br />
Seta o usuário e senha do usuário que irá ser &#8220;manipulado&#8221;,  é obrigatório o parâmentro $username,  caso não seja informado o parâmentro $password, não se consiguirá &#8220;Twittar&#8221;.<br />
Fiz dessa forma por que pode haver o caso de você programador não necessitar fazer tweet, somente buscar os últimos tweets do usuário</li>
</ul>
<ul>
<li><strong>update( $message );</strong><br />
Faz a atualização do status do usuário no perfil do orkut, ou popularmente faz um Tweet.<br />
É verifica se o usuário informou o usuário e seha, caso não seja informado, gera um Fatar error como esse:<br />
<em><strong>&#8220;Fatal error</strong>: O membro $userpwd não pode ser nulo. in <strong>C:\wamp\www\espaco_cidadania\twitter\TwitterStatuses.php</strong> on line <strong>78&#8243;</strong></em><em><strong> </strong></em></li>
<li><strong>user_timeline();<br />
</strong>Retorna os últimos tweets postados pelo o usuário.</li>
<li><strong>setUsername(); e setPassword();<br />
</strong>São métodos para setar os valores dos membros $username, $password e $userpwd</li>
</ul>
<p>Agora que já está explicado os métodos da classe, vamos aos exemplos.</p>
<p><strong>Retornando os Tweets</strong></p>
<pre class="brush: php; title: ; notranslate">
&lt;?php
// Requer o arquivo da classe
require_once('TwitterStatuses.php');

// Inicia o objeto e passa o usuário
$twitter = new TwitterStatuses('nome_do_usuario_no_twitter');
// Retorna a Timeline
$status  = $twitter-&gt;user_timeline();

// Verifica se o retorno está OK
if($status) {
 // Número de Tweets
 $num_status = count($status);

 // Faz o loop
 for($i=0; $i&lt;$num_status; $i++) {
 // Tweet Corrente
 $current = $status[$i];

 // Exibe alguams informações
 echo 'id:' . $current-&gt;id . '&lt;br /&gt;Date:'.date('d/m/Y H:i:s', strtotime($current-&gt;created_at)).'&lt;br /&gt;Messagem: ' . utf8_decode($current-&gt;text);

 // Exibe os dados retornado no Tweet corrente
 echo '&lt;br /&gt;&lt;br /&gt;Resposta do Twitter&lt;br /&gt;------------------------------------------&lt;br /&gt;';
 print_r($current);
 echo '&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;';
 }
}
?&gt;
</pre>
<p><strong>Atualizando o status do Twitter</strong></p>
<pre class="brush: php; title: ; notranslate">
&lt;?php
// Requer o arquivo da classe
require_once('TwitterStatuses.php');

// Inicia o objeto e passa o usuário
$twitter = new TwitterStatuses('nome_do_usuario_no_twitter', 'senha_do_usuario');

// twita
if($twitter-&gt;update('Twitando pela classe TwiterStatuses')){
 echo 'Tweet realizado com sucesso';
} else {
 echo 'Não foi possível twittar';
}
</pre>
<p>Então pessoal é isso ai,  até a próxima</p>
<p>Referência:<br />
<a href="http://www.marksanborn.net/howto/getting-your-twitter-updates-with-curl">http://www.marksanborn.net/howto/getting-your-twitter-updates-with-curl</a><br />
<a href="http://morethanseven.net/2007/01/20/posting-to-twitter-using-php.html">http://morethanseven.net/2007/01/20/posting-to-twitter-using-php.html</a></p>
<div class="awmp_tags"><a href="http://www.johnmarques.com.br/search/cURL/" rel="tag">cURL</a> <a href="http://www.johnmarques.com.br/search/PHP/" rel="tag">PHP</a> <a href="http://www.johnmarques.com.br/search/Twitter/" rel="tag">Twitter</a> <a href="http://www.johnmarques.com.br/search/update/" rel="tag">update</a> <a href="http://www.johnmarques.com.br/search/user_timeline/" rel="tag">user_timeline</a> <a href="http://www.johnmarques.com.br/search/statuses/" rel="tag">statuses</a> <a href="http://www.johnmarques.com.br/search/TwitterStatuses/" rel="tag">TwitterStatuses</a></div>]]></content:encoded>
			<wfw:commentRss>http://www.johnmarques.com.br/php/classe-twitterstatuses-atualizando-e-retornando-tweets/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Entrar como root no Fedora 12 Gnome</title>
		<link>http://www.johnmarques.com.br/linux/entrar-como-root-no-fedora-12-gnome/</link>
		<comments>http://www.johnmarques.com.br/linux/entrar-como-root-no-fedora-12-gnome/#comments</comments>
		<pubDate>Fri, 07 May 2010 20:55:04 +0000</pubDate>
		<dc:creator>John Marques</dc:creator>
				<category><![CDATA[Dicas]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[autenticar]]></category>
		<category><![CDATA[constantine]]></category>
		<category><![CDATA[Fedora]]></category>
		<category><![CDATA[fedora 12]]></category>
		<category><![CDATA[root]]></category>

		<guid isPermaLink="false">http://www.johnmarques.com.br/?p=270</guid>
		<description><![CDATA[Olá Galera, Seguinte fiquei bem feliz agora, então resolvi postar um artigo falando sobre o assunto. Instalei  o VirtualBox para testar alguns Linux, para aprender algumas coisas. Sou acostumado a usar a distrubuição da Red Hat, gosto dela, então instalei Fedora 12 Constantine, mas ai veio um problema não consiguir acessar como root, no ambiente [...]]]></description>
			<content:encoded><![CDATA[<p>Olá Galera,</p>
<p>Seguinte fiquei bem feliz agora, então resolvi postar um artigo falando sobre o assunto.<span id="more-270"></span></p>
<p>Instalei  o VirtualBox para testar alguns Linux, para aprender algumas coisas. Sou acostumado a usar a distrubuição da Red Hat, gosto dela, então instalei Fedora 12 Constantine, mas ai veio um problema não consiguir acessar como root, no ambiente gráfico, fiquei muito mordido por que tinha que fazer algumas coisas com Shell, que pelo ambiente gráfico seria muito mais simples, então dei um olhada na internet  para ver o que a comunidade falava.</p>
<p>Então descobri que eles pediam para que alterassem um arquivo e comentasse uma linha. O arquivo é <strong>/etc/pam.d/gdm</strong> e comentasse a linha <strong>auth required pam_succed_if.so user != root quiet</strong>, então veio o problema não funcionava, então acabei deixando de lado, mas hoje estava mexendo no Fedora e me surgiu o mesmo problema do começo, a dificuldade em fazer algumas coisas no ambiente gráfico sem o usuário root, então resolvi fuçar e tentar resolver de uma vez, acabei que consegui \0/. Descobri que além do arquivo <strong>/etc/pam.d/gdm</strong>, existe outro arquivo que estava restringindo o acesso, era o arquivo <strong>/etc/pam.d/gdm-password, </strong>então bastou comentar a linha<strong> auth required pam_succed_if.so user != root quiet</strong> para funcionar.</p>
<p>Então pessoal está ai a dica =D</p>
<p>Abraços,</p>
<p>John Marques</p>
]]></content:encoded>
			<wfw:commentRss>http://www.johnmarques.com.br/linux/entrar-como-root-no-fedora-12-gnome/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>O velho atributo nofollow e as novas mudanças do Google</title>
		<link>http://www.johnmarques.com.br/dicas/o-velho-atributo-nofollow-e-as-novas-mudancas-do-google/</link>
		<comments>http://www.johnmarques.com.br/dicas/o-velho-atributo-nofollow-e-as-novas-mudancas-do-google/#comments</comments>
		<pubDate>Fri, 30 Apr 2010 13:48:36 +0000</pubDate>
		<dc:creator>Christian Borchardt</dc:creator>
				<category><![CDATA[Dicas]]></category>
		<category><![CDATA[SEO]]></category>
		<category><![CDATA[atributo]]></category>
		<category><![CDATA[gogole]]></category>
		<category><![CDATA[nofollow]]></category>
		<category><![CDATA[sculpting]]></category>
		<category><![CDATA[tecnica]]></category>

		<guid isPermaLink="false">http://www.johnmarques.com.br/?p=251</guid>
		<description><![CDATA[O atributo nofollow foi criado para que o desenvolvedor pudesse colocar links em um site mas &#8220;dizer&#8221; para os mecanismos de busca não o seguirem, simples assim! Um exemplo: Você tem uma matéria que fala sobre &#8220;notebooks&#8221; e quer citar a página de uma empresa de notebooks mas não quer dar crédito a ela, era [...]]]></description>
			<content:encoded><![CDATA[<p>O atributo <em>nofollow</em> foi criado para que o desenvolvedor pudesse colocar links em um site mas &#8220;dizer&#8221; para os mecanismos de busca não o seguirem, simples assim!<span id="more-251"></span></p>
<p>Um exemplo: Você tem uma matéria que fala sobre &#8220;notebooks&#8221; e quer citar a página de uma empresa de notebooks mas não quer dar crédito a ela, era só colocar o link da seguinte forma:</p>
<pre class="brush: xml; title: ; notranslate"> &lt;a rel=&quot;nofollow&quot; href=&quot;//www.exemplo.com.br&quot;&gt;Visitar a página de exemplo&lt;/a&gt; </pre>
<p>Mas este mesmo atributo começou a ser usado também para esculpir o Pagerank de um site em uma técnica chamada de &#8220;Pagerank Sculpting&#8221;.</p>
<p>Esculpir o Pagerank seria por exemplo: Você tem um site e logicamente não necessita que o Google dê maior relevância a página de contato do seu site, porém, todas as suas páginas tem um link para a página de contato. Então bastava adicionar o atributo <em>nofollow</em> ao link &#8220;contato&#8221;, assim a relevância dos outros links aumentava.</p>
<p>Isso podia ser feito de uma forma mais&#8230; mais&#8230; maligna específica no seguinte exemplo:</p>
<p>Você possui uma matéria falando sobre pássaros, e nesta matéria tem 10 links diferentes. Em nove desses links você usava o atributo <em>nofollow</em> e único link que não possuía o <em>nofollow</em> era o que levava a maior relevância nos mecanismos de pesquisa. Entenderam a jogada? Pensem mais um pouquinho então.</p>
<p>Agora <a href="http://www.mattcutts.com/blog/pagerank-sculpting/">o Google anunciou</a> que não mais irá considerar o atributo <em>nofollow</em> para estes fins (Pagerank sculpting) e sim apenas para o propósito inicial, não seguir os links.</p>
<p>Então, podem continuar usando este atributo, por exemplo, nos links de comentários em um site&#8230;</p>
<p>Nos links daquela empresa que não gosta mas teve que citar&#8230;</p>
<p>Mas quem era fã da técnica de Esculpir o Pagerank terá que pensar em links dentro de um iframe ou links em javascript complexos para que o Google não os siga.</p>
<div class="awmp_tags"><a href="http://www.johnmarques.com.br/search/atributo/" rel="tag">atributo</a> <a href="http://www.johnmarques.com.br/search/nofollow/" rel="tag">nofollow</a> <a href="http://www.johnmarques.com.br/search/gogole/" rel="tag">gogole</a> <a href="http://www.johnmarques.com.br/search/tecnica/" rel="tag">tecnica</a> <a href="http://www.johnmarques.com.br/search/sculpting/" rel="tag">sculpting</a></div>]]></content:encoded>
			<wfw:commentRss>http://www.johnmarques.com.br/dicas/o-velho-atributo-nofollow-e-as-novas-mudancas-do-google/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Array_diff &#8211; Diferença entre Arrays</title>
		<link>http://www.johnmarques.com.br/php/array_diff-diferenca_entre_arrays/</link>
		<comments>http://www.johnmarques.com.br/php/array_diff-diferenca_entre_arrays/#comments</comments>
		<pubDate>Tue, 27 Apr 2010 22:03:08 +0000</pubDate>
		<dc:creator>John Marques</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[array]]></category>
		<category><![CDATA[array_diff]]></category>
		<category><![CDATA[diferença]]></category>
		<category><![CDATA[url]]></category>

		<guid isPermaLink="false">http://www.johnmarques.com.br/?p=245</guid>
		<description><![CDATA[Olá pessoal, olha eu aqui de novo. rs. Seguinte hoje vou falar sobre o array_diff, que foi uma mão, melhor um braço na roda para mim, pois estou trabalhando com URL amigáveis em um sistema e ele me ajudou muito, então vamos lá. Extraído do Manual PHP array_diff &#8220;Analisa as diferenças entre arrays&#8221; Então, ai [...]]]></description>
			<content:encoded><![CDATA[<p>Olá pessoal,</p>
<p>olha eu aqui de novo. rs.</p>
<p>Seguinte hoje vou falar sobre o array_diff, que foi uma mão, melhor um braço na roda para mim, pois estou trabalhando com URL amigáveis em um sistema e ele me ajudou muito, então vamos lá.<span id="more-245"></span></p>
<p><strong><em>Extraído do Manual PHP</em><em><br />
array_diff<br />
&#8220;Analisa as diferenças entre arrays&#8221;</em></strong></p>
<p>Então, ai você me pergunta para que? Ai eu digo imagine que você tem elementos em um vetor e quer saber quais dele não contém em outro (lembrei das aulas de matemática da escola contém e não contém, haushhuas), então no meu caso o que aconteceu foi o seguinte, eu tinha uma URL e queria saber as partes dessa que não contia na variavel que contém a url raiz.</p>
<p>Assim,</p>
<p>Ex.:</p>
<p>Variável contendo a url raiz do site</p>
<pre class="brush: php; title: ; notranslate">$url_raiz = 'http://www.johnmarques.com.br/novo_site/';</pre>
<p>ai por exemplo o url requisitada nesse momento seja http://www.johnmarques.com.br/novo_site/2010/,  então eu queria que sistema soubesse que a diferença era a &#8220;pasta&#8221; 2010, dei um olhada por cima no Senhor da Internet, procurando por diferença entre Strings, mas não achei muita coisa ai, pensei putz por que não quebra a url em partes de um vetor e depois fazer uma comparação, então foi isso que fiz, e Bingo! ;D</p>
<p>Vou demonstrar mais ou menos como fiz.</p>
<p>Antes de explicar, vale lembrar que a função array_diff não faz diferenciação entre vetores multi-dimensionais então você tem que diferenciar vetores no mesmo nível.</p>
<p><em><strong>Extraído do Manual PHP<br />
<strong>Nota: </strong>Note que esta função faz compara apenas uma dimensão de um array  com dimensão n. Mas, obviamente, você pode comparar outras dimensões usando <var>array_diff($array1[0], $array2[0]);</var>.</strong></em></p>
<p>e que também ele faz uma comparação igual a operador de comparação de semelhança (===), sendo assim mais ou menos isso, <var>(string) $elem1 === (string) $elem2.</var></p>
<p>Outra coisa que vale resaltar e que ele verifica os elementos que vetor 01 e que não contém no vetor 02 e as chaves desses elementos são preservadas.</p>
<p>Agora o exemplo.</p>
<p>fiz mais ou menos assim:</p>
<pre class="brush: php; title: ; notranslate">
&lt;?php
$url_raiz = 'http://www.johnmarques.com.br/novo_site/';
$url_req = $_SERVER['REQUEST_URI']; // No caso o valor seria /novo_site/2010/, perceba que não tem o dominio, então eu fiz assim na variavel $url_raiz, dividi em duas

$url_dominio = 'http://www.johnmarques.com.br';
$url_base = '/novo_site/';
$url_raiz = $url_dominio . $url_base;
$url_req = $_SERVER['REQUEST_URI'];

// Ai ficou mais fácil fazer a comparação
function retorna_vetor($url)
{
   $partes = explode('/',$url);
   $i=0;
   $partes_new = array();

   foreach($partes as $key =&gt; $value)
   {
      if($value != '')
      {
          $partes_new[$i] = $value;
          $i++;
      }
   }

   return $partes_new;
}

// faço o mesmo processo no outro
$vetor_req = retorna_vetor($url_req);
$vetor_raiz = retorna_vetor($url_base);

print_r(array_diff($vetor_req,$vetor_raiz)); // provávelmente irá retorna array(1=&gt;2010)
?&gt;
</pre>
<p>ai ficou fácil,</p>
<p>espero que tenha alguma serventia, para mim pelo menos foi um braço na roda, se alguém tiver um forma melhor de ser feito pode comentar e explicar como funcionaria.</p>
<p>Abraço a todos,</p>
<p>John Marques</p>
<div class="awmp_tags"><a href="http://www.johnmarques.com.br/search/array_diff/" rel="tag">array_diff</a> <a href="http://www.johnmarques.com.br/search/array/" rel="tag">array</a> <a href="http://www.johnmarques.com.br/search/php/" rel="tag">php</a> <a href="http://www.johnmarques.com.br/search/diferença/" rel="tag">diferença</a> <a href="http://www.johnmarques.com.br/search/vetor/" rel="tag">vetor</a> <a href="http://www.johnmarques.com.br/search/url/" rel="tag">url</a> <a href="http://www.johnmarques.com.br/search//" rel="tag"></a></div>]]></content:encoded>
			<wfw:commentRss>http://www.johnmarques.com.br/php/array_diff-diferenca_entre_arrays/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

