<?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>Rafael Marin &#187; PHP</title>
	<atom:link href="http://rafaelmarin.com.br/category/php/feed/" rel="self" type="application/rss+xml" />
	<link>http://rafaelmarin.com.br</link>
	<description>User experience designer, user interface designer, ux, ui</description>
	<lastBuildDate>Sun, 10 Jan 2010 17:07:02 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>Anunciamos o Spaghetti*, nosso framework de desenvolvimento</title>
		<link>http://rafaelmarin.com.br/anunciamos-o-spaghetti-nosso-framework-de-desenvolvimento/</link>
		<comments>http://rafaelmarin.com.br/anunciamos-o-spaghetti-nosso-framework-de-desenvolvimento/#comments</comments>
		<pubDate>Sun, 02 Nov 2008 00:02:19 +0000</pubDate>
		<dc:creator>Rafael Marin</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Produtividade]]></category>
		<category><![CDATA[php oop]]></category>
		<category><![CDATA[spaghetti]]></category>

		<guid isPermaLink="false">http://rafaelmarin.com.br/?p=178</guid>
		<description><![CDATA[É, meus amigos, este é o motivo da minha ausência nos ultimos tempos. Um projeto interessante me tomou bastante tempo, e quero hoje, junto com o Julio Greff, anunciar que ele está quase pronto. Pessoal, com vocês, o nosso Spaghetti* Framework. Um framework para pequenas e médias aplicações.]]></description>
			<content:encoded><![CDATA[<p><img class="alignnone size-full wp-image-179" title="spaghettilogo" src="http://static.rafaelmarin.com.br/blog/uploads/2008/11/spaghettilogo.gif" alt="" width="362" height="69" /></p>
<p>É, meus amigos, este é o motivo da minha ausência nos ultimos tempos. Um projeto interessante me tomou bastante tempo, e quero hoje, junto com o <a href="http://juliogreff.net">Julio Greff</a>, anunciar que ele está quase pronto. Pessoal, com vocês, o nosso <strong>Spaghetti* Framework</strong>. Um <em>framework</em> para pequenas e médias aplicações.</p>
<p>Desenvolver para Web hoje já requer certa maturidade, quem não desenvolve um <em>workflow</em> produtivo dificilmente consegue se manter no mercado. Sentimos necessidade de uma ferramenta que tornasse nosso trabalho mais rápido, produtivo e divertido, porém sem perder qualidade. Usamos <a href="http://www.cakephp.org">alguns frameworks</a> e <a href="http://www.codeigniter.com">cogitamos</a> <a href="http://www.djangoproject.com">outras</a> <a href="http://www.rubyonrails.org">possibilidades</a>. Porém os <em>frameworks</em> PHP existentes até então eram grandes e inflexíveis demais para nossas necessidades reais, e migrar de linguagem é algo custoso, que requer uma curva de aprendizagem maior e um tempo que não tínhamos.</p>
<h2>Chegou a hora de fazer nosso próprio <em>framework</em>.</h2>
<p>A proposta inicial era pouco pretenciosa: um <em>framework</em> simples, sem MVC, mas que contivesse um modelo de dados e suporte nativo às URLs amigáveis. Essa era a nossa primeira versão e nosso primeiro escopo. Porém os projetos foram crescendo em número e dimensões, e sentimos que MVC seria a melhor solução. O Julio fez a escolha certa ao escolher o <em>design pattern</em> mais badalado do meio. MVC nos trouxe uma grande flexibilidade, que nunca haviamos conseguido antes.</p>
<p>Foram alguns meses de trabalho, tanto meu quanto do Julio, e acreditamos que o diferencial do nosso <em>framework</em> é que durante todo o processo de desenvolvimento do Spaghetti ele foi utilizado na prática. Sem <em>cookbooks</em>, sem <em>15-minute blog tutorials</em>. Para cada etapa do processo de desenvolvimento do <em>core</em> do Spaghetti foi desenvolvido um Website ou sistema real, que hoje encontra-se em produção, funcionando.</p>
<p>Desde a versão não-MVC, há sites de clientes <a href="http://www.codebrasil.com.br">da agência onde trabalhamos</a> rodando o Spaghetti. No meu ponto de vista isso é positivo, pois desenvolvemos uma plataforma baseada em problemas reais, com clientes reais e ambientes reais de desenvolvimento. Por isso, pensamos no Spaghetti como um <em>framework</em> sem utopias. O que existe é o que é usado de verdade.</p>
<p>Flexibilidade é a palavra de honra. CMSs geralmente limitam as capacidades dos desenvolvedores Web / clientes. <em>Frameworks</em> são super flexíveis em todos os aspectos, e não queremos ser diferentes nesse quesito. As funcionalidades já embutidas podem ser expandidas e novas podem ser adicionadas com Componentes que você mesmo pode escrever.</p>
<h2>A que pé estamos?</h2>
<p>O Spaghetti hoje supre muito bem todas as necessidades de desenvolvimento da nossa equipe na agência. Porém, estamos tornando esse projeto público. Ou seja, precisamos documentar tudo excepcionalmente bem, gravar <em>screencasts</em>, tutoriais, e até fazer um <em>cookbook</em>. Ou seja, nosso <em>framework</em> está pronto para uso, porém ele ainda não está pronto para que vocês, que estão conhecendo ele agora, saibam de tudo que ele é capaz.</p>
<p>Caso você seja curioso &#8211; e garanto que é &#8211; deve estar pensando onde está o código. Caso você queira dar uma olhada (por enquanto por sua conta e risco &#8211; já que não há documentação ainda), <strong><a href="http://trac.spaghettiphp.org">você pode acessar nosso Trac</a></strong>, e lá há inclusive o histórico de versões e revisões.</p>
<h2>Lançamento oficial do <em>release</em> estável</h2>
<p><strong>[UPDATE]</strong> O lançamento oficial do Spaghetti* aconteceu em 1 de janeiro de 2009, junto ao lançamento do site oficial em <a href="http://spaghettiphp.org/">www.spaghettiphp.org</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://rafaelmarin.com.br/anunciamos-o-spaghetti-nosso-framework-de-desenvolvimento/feed/</wfw:commentRss>
		<slash:comments>22</slash:comments>
		</item>
		<item>
		<title>PHPolêmico e o constante crescimento na programação</title>
		<link>http://rafaelmarin.com.br/php-polemico/</link>
		<comments>http://rafaelmarin.com.br/php-polemico/#comments</comments>
		<pubDate>Wed, 02 Jul 2008 13:40:57 +0000</pubDate>
		<dc:creator>Rafael Marin</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Produtividade]]></category>

		<guid isPermaLink="false">http://rafaelmarin.com.br/?p=148</guid>
		<description><![CDATA[O Julio Greff mostrou sua opinião ácida sobre PHP, e isso gerou uma polêmica gigantesca. Na verdade a discussão foi além da opinião de cada um sobre a linguagem, e o pessoal - com certa ignorância - colocou na roda argumentos ridículos, como idade e "amadorismo".]]></description>
			<content:encoded><![CDATA[<p>O <a href="http://juliogreff.blog.br/frameworks-por-um-php-menos-ruim/">Julio Greff mostrou sua opinião ácida sobre PHP</a>, e isso gerou uma polêmica gigantesca. Na verdade a discussão foi além da opinião de cada um sobre a linguagem, e o pessoal &#8211; com certa ignorância &#8211; colocou na roda argumentos ridículos, como idade e &#8220;amadorismo&#8221;. Cada um tem o direito sim de ter uma opinião e poder expressá-la, ainda mais em seu blog. Nunca achei que blogs fossem espaços democráticos, mas lá no blog dele a tolerância foi grande.</p>
<p>Enfim, o assunto não é esse. Mesmo tendo mudado de título definitivamente (de quase-programador para aprendiz-de-designer), não nego a importância da programação para o Web designer. Você tem sim que saber um pouco de XHTML e CSS, mas um pouco de programação não faz mal. Não é questão de prioridades, de se focar num assunto específico, isso é bobagem. O profissional deve ser bom sim no que faz, mas sempre deve estar aberto e ter conhecimento do trabalho do colega ao lado.</p>
<p>Eis que então, meus amigos, como é de conhecimento de vocês, eu já tenho <a href="http://rafaelmarin.com.br/eu-quero-um-framework/">alguma experiência básica</a> com <a href="http://cakephp.org">CakePHP</a>. Começamos a utilizá-lo na agência onde eu e o Julio trabalhamos, e eu realmente fiquei surpreso com o grande potencial tanto do framework quanto do PHP. Li por várias vezes a documentação, a API, e as entranhas do Cake, e vi como o funcionamento é simples.</p>
<p>PHP, de fato, não é uma linguagem ruim. Eu digo que não gosto da sintaxe do PHP, pois prefiro a do Ruby, mas nem por isso odeio o PHP. Essa é a minha opinião. Quanto mais eu conheço a linguagem, mais estou gostando dela. Até pouco tempo utilizava PHP4, mas em 2008 <a href="http://rafaelmarin.com.br/cara-orientacao-a-objetos-e-tao-divertido/">comecei a entender toda a lógica por traz da orientação a objetos</a>. Isso me abriu as portas para entender esse potencial do PHP.</p>
<p>PHP, apesar da sintaxe não tão legal (<strong>opinião pessoal</strong>), está bastante madura, a julgar pela quantidade de extensões existentes, sem falar na grande abrangência desta linguagem.</p>
<p>Como eu <a href="http://rafaelmarin.com.br/vamos-falar-de-produtividade/">havia dito</a>, independente da linguagem cada um tem que procurar ser mais produtivo. Talvez eu não seja mais produtivo que o pessoal que comentou lá (cujo tom de arrogância de alguns faz parecer que estes sabem tudo de PHP), mas eu sei que estou amadurecendo e que estou me tornando produtivo se comparado a mim mesmo há um ano. Inclusive no design.</p>
<p>Espero não entrar mais nessas discussões, pois já disse aqui várias vezes o que penso e que estou me distanciando um pouco da programação pois &#8211; <strong>salvas excessões</strong> &#8211; há muita arrogância e ignorância entre os programadores.</p>
]]></content:encoded>
			<wfw:commentRss>http://rafaelmarin.com.br/php-polemico/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Cara, orientação a objetos é tão divertido!</title>
		<link>http://rafaelmarin.com.br/cara-orientacao-a-objetos-e-tao-divertido/</link>
		<comments>http://rafaelmarin.com.br/cara-orientacao-a-objetos-e-tao-divertido/#comments</comments>
		<pubDate>Fri, 18 Apr 2008 00:54:08 +0000</pubDate>
		<dc:creator>Rafael Marin</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[php oop]]></category>

		<guid isPermaLink="false">http://rafaelmarin.com.br/?p=124</guid>
		<description><![CDATA[Eu sempre quis aprender programação orientação a objetos. Mas sempre me pareceu algo bastante subjetivo, difícil de entender a primeira vista. Foram algumas tentativas até que, finalmente, as peças começaram a se encaixar e toda essa história de classes, herança, objetos, começaram a fazer sentido.]]></description>
			<content:encoded><![CDATA[<p>Eu sempre quis aprender <a href="http://pt.wikipedia.org/wiki/POO">programação orientação a objetos</a>. Mas sempre me pareceu algo bastante subjetivo, difícil de entender a primeira vista. Foram algumas tentativas até que, finalmente, as peças começaram a se encaixar e toda essa história de classes, herança, objetos, começaram a fazer sentido. Custou, ah se custou. Passei muito tempo tentando entender, não pela linguagem, mas pela lógica atrás disso.</p>
<p>Programar em seqüência, proceduralmente, sempre pareceu muito natural para mim. Até o momento que eu percebi que reinventar a roda não é lá o que se pode chamar de produtivo. Ainda não fiz nada, meus amigos, não esperem um grande lançamento de software de minha parte. Mas já é um bom começo ao menos entender a lógica por trás de tanta coisa abstrata.</p>
<p>Dica: Se alguém aí também não entende, o <a href="http://www.digitalminds.com.br/">Danilo do Digital Minds</a> publica infreqüentemente <a href="http://www.digitalminds.com.br/tags/zenoop">uma série de artigos muito bons sobre PHP OO</a> para quem também está boiando no assunto.</p>
<p>Eu uso PHP, e estou estudando (e finalmente entendendo) orientação a objetos. E você, como programa?</p>
]]></content:encoded>
			<wfw:commentRss>http://rafaelmarin.com.br/cara-orientacao-a-objetos-e-tao-divertido/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>Número de assinantes do seu feed com FeedBurner</title>
		<link>http://rafaelmarin.com.br/numero-de-assinantes-do-seu-feed-com-feedburner/</link>
		<comments>http://rafaelmarin.com.br/numero-de-assinantes-do-seu-feed-com-feedburner/#comments</comments>
		<pubDate>Fri, 28 Mar 2008 13:08:39 +0000</pubDate>
		<dc:creator>Rafael Marin</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[feed]]></category>
		<category><![CDATA[feedburner]]></category>

		<guid isPermaLink="false">http://rafaelmarin.com.br/numero-de-assinantes-do-seu-feed-com-feedburner/</guid>
		<description><![CDATA[O Alexandre me pediu como eu faço para exibir o número de assinantes do meu feed &#8216;queimado&#8217; com o FeedBurner, sem usar o chicklet (a imagenzinha feia ) que o FeedBurner proporciona. Ao invés de mandar um e-mail, resolvi compartilhar a resposta através de um post, para possíveis futuras referências. Acontece que o FeedBurner disponibiliza a Awareness API, que serve justamente para acesso dos dados de tráfego do seu feed através de aplicativos que não são do FeedBurner. Para obter tais informações, você deve ativar esta API no menu Publicize &#62; Awareness API, do seu painel de controle do FeedBurner. A partir de então, você pode ter acesso aos dados do seu feed através do seguinte endereço: http://api.feedburner.com/awareness/1.0/GetFeedData?uri=seuusuario Lembrando que [...]]]></description>
			<content:encoded><![CDATA[<p>O <a rel="external friend" href="http://www.alexandreformagio.com.br/">Alexandre</a> <a href="http://rafaelmarin.com.br/photoshop-express-flash-que-presta/#comment-823">me pediu</a> como eu faço para exibir o número de assinantes do meu <em>feed</em> &#8216;queimado&#8217; com o <a rel="external" href="http://www.feedburner.com">FeedBurner</a>, sem usar o <em>chicklet</em> (a imagenzinha feia <img src="http://feeds.feedburner.com/~fc/rafaelmarin?bg=00CCCC&amp;fg=333333&amp;anim=0" alt="Assinantes do feed" />) que o FeedBurner proporciona. Ao invés de mandar um e-mail, resolvi compartilhar a resposta através de um post, para possíveis futuras referências.</p>
<p>Acontece que o FeedBurner disponibiliza a Awareness API, que serve justamente para acesso dos dados de tráfego do seu <em>feed</em> através de aplicativos que não são do FeedBurner. Para obter tais informações, você deve ativar esta API no menu <em>Publicize &gt; Awareness API</em>, do seu painel de controle do FeedBurner.</p>
<p>A partir de então, você pode ter acesso aos dados do seu <em>feed </em>através do seguinte endereço:</p>
<p><code>http://api.feedburner.com/awareness/1.0/GetFeedData?uri=<strong>seuusuario</strong></code></p>
<p>Lembrando que você deve substituir <code>seuusuario</code> pelo seu nome de usuário do FeedBurner. Este é o endereço da sua API, e você tem acesso livre a estes dados. Como uso WordPress, e meu servidor é PHP e suporta a versão 5, utilizando a extensão SimpleXML com duas linhas de código eu consigo retornar o número de assinantes. Veja como é simples.</p>
<p><code><br />
&lt;?php</code><br />
<code style="overflow: scroll; width: 500px"><br />
$feedburner = simplexml_load_file('http://api.feedburner.com/awareness/1.0/GetFeedData?uri=seuusuario');<br />
</code><br />
<code><br />
echo $feedburner-&gt;feed[0]-&gt;entry[0]['circulation'];<br />
?&gt;<br />
</code><br />
Com quem usa ASP, eu já não manjo muito e não sei dizer como manipular XML. Se alguém souber, me mande que eu coloco e credito.</p>
<p>Respondido, Alexandre?</p>
]]></content:encoded>
			<wfw:commentRss>http://rafaelmarin.com.br/numero-de-assinantes-do-seu-feed-com-feedburner/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Descubra sua senha do ENEM</title>
		<link>http://rafaelmarin.com.br/descubra-sua-senha-do-enem/</link>
		<comments>http://rafaelmarin.com.br/descubra-sua-senha-do-enem/#comments</comments>
		<pubDate>Mon, 26 Nov 2007 19:38:05 +0000</pubDate>
		<dc:creator>Rafael Marin</dc:creator>
				<category><![CDATA[Cotidiano]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://rafaelmarin.com.br/descubra-sua-senha-do-enem/</guid>
		<description><![CDATA[Chegou a época de receber os resultados do Exame Nacional do Ensino Médio, e com ele veio o desespero de muitos. Não pelo desempenho nas questões objetivas ou na redação, mas pelo fato de boa parte da galera ter esquecido de anotar a senha para acessar o boletim on-line lá, no site do INEP. Ter o resultado do ENEM é importante, pois em muitas universidades as notas podem ser aproveitadas. Com o caótico congestionamento no site do Exame, a recuperação de senha ficou indisponível por dias. Eis que então, em 5 minutinhos, eu fiz um script que &#8211; utilizando o algoritmo da senha do ENEM &#8211; gera a senha de acesso a partir do número de inscrição. Fiz em 5 [...]]]></description>
			<content:encoded><![CDATA[<p><script type="text/javascript"><!--
google_ad_client = "pub-5365458027652668";
/* Enem no Blog */
google_ad_slot = "0463734974";
google_ad_width = 336;
google_ad_height = 280;
//-->
</script><br />
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script></p>
<p>Chegou a época de receber os resultados do Exame Nacional do Ensino Médio, e com ele veio o desespero de muitos. Não pelo desempenho nas questões objetivas ou na redação, mas pelo fato de boa parte da galera ter esquecido de anotar a senha para acessar o boletim on-line lá, no <a href="http://enem.inep.gov.br">site do INEP</a>.</p>
<p>Ter o resultado do ENEM é importante, pois em muitas universidades as notas podem ser aproveitadas. Com o caótico congestionamento no site do Exame, a recuperação de senha ficou indisponível por dias.</p>
<p>Eis que então, em 5 minutinhos, eu fiz um script que &#8211; utilizando o algoritmo da senha do ENEM &#8211; gera a senha de acesso a partir do número de inscrição.</p>
<p>Fiz em 5 minutos, mesmo. Ou até menos. Só agora dei uma embelezada no negócio.</p>
<p><a href="http://rafaelmarin.com.br/enem" style="padding: 5px; background: #FFC; display: block; text-align: center; border: 1px outset #FFC; font-size: 17px"><strong>Clique aqui para saber a sua senha do ENEM</strong></a></p>
<p><script type="text/javascript"><!--
google_ad_client = "pub-5365458027652668";
/* Enem no Blog */
google_ad_slot = "0463734974";
google_ad_width = 336;
google_ad_height = 280;
//-->
</script><br />
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script></p>
<h2>O algoritmo e a falcatrua</h2>
<p>Na verdade, a senha não é um número randômico, salvo em um banco de dados, e nem usei API nenhuma (até por que o pessoal do governo nem deve saber o que é uma API). O cálculo da senha é feito com base no número da inscrição, que é uma string de 12 caracteres numéricos. E a senha, sendo também uma string numérica de 8 caracteres, é calculada da seguinte maneira (cada item é um dos caracteres da senha):</p>
<ul>
<li> 9 &#8211; 9° número da string</li>
<li>10° número da string</li>
<li>9 &#8211; 11° número da string</li>
<li>12° número da string</li>
<li>9 &#8211; 5° número da string</li>
<li>6° número da string</li>
<li>9 &#8211; 7° número da string</li>
<li>8° número da string</li>
</ul>
<p>Alguém se habilita a fazer o script em Javascript?</p>
]]></content:encoded>
			<wfw:commentRss>http://rafaelmarin.com.br/descubra-sua-senha-do-enem/feed/</wfw:commentRss>
		<slash:comments>46</slash:comments>
		</item>
		<item>
		<title>Eu quero um framework!</title>
		<link>http://rafaelmarin.com.br/eu-quero-um-framework/</link>
		<comments>http://rafaelmarin.com.br/eu-quero-um-framework/#comments</comments>
		<pubDate>Sun, 30 Sep 2007 19:26:40 +0000</pubDate>
		<dc:creator>Rafael Marin</dc:creator>
				<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://rafaelmarin.com.br/eu-quero-um-framework/</guid>
		<description><![CDATA[Na verdade, na verdade mesmo, sou desenvolvedor designer de experiência do usuário. Claro que gosto muito de implementação front-end (XHTML e CSS), e este também é meu serviço. Mas sinto a cada dia que passa que meu chão é programação design. A linguagem que venho me dando bem é o PHP, mas nos ultimos meses venho sentindo que na programação eu posso e preciso ser ainda mais produtivo. Com o desenvolvimento de um sistema particular, melhorei muito essa questão da simplicidade e produtividade da programação, mas isso não é o suficiente. Nada comparado a Ruby on Rails, Django, ou mesmo CakePHP. Tenho conversado com alguns amigos sobre qual é a escolha certa. Tentei começar com Ruby, tentei começar com Python. [...]]]></description>
			<content:encoded><![CDATA[<p>Na verdade, na verdade mesmo, <del datetime="2009-06-29T11:57:19+00:00">sou desenvolvedor</del> <ins datetime="2009-06-29T11:57:19+00:00">designer de experiência do usuário</ins>. Claro que gosto muito de implementação <em>front-end</em> (XHTML e CSS), e este também é meu serviço. Mas sinto a cada dia que passa que meu chão é <del datetime="2009-06-29T11:58:06+00:00">programação</del> <ins datetime="2009-06-29T11:58:06+00:00">design</ins>. A linguagem que venho me dando bem é o PHP, mas nos ultimos meses venho sentindo que na programação eu posso e preciso ser ainda mais produtivo. Com o desenvolvimento de um sistema particular, melhorei muito essa questão da simplicidade e produtividade da programação, mas isso não é o suficiente.</p>
<p>Nada comparado a Ruby on Rails, Django, ou mesmo CakePHP. Tenho conversado com <a rel="friend" href="http://darlanglauber.wordpress.com">alguns</a> <a rel="friend" href="http://blog.eucrio.com">amigos</a> sobre qual é a escolha certa. Tentei começar com Ruby, tentei começar com Python. Nada feito. Gosto muito do PHP, e foi só essa semana que parei para pensar que não preciso sair do PHP para ser produtivo. E aí começa minha aventura.</p>
<p>Resolvi que escolhi o <a href="http://cakephp.org">CakePHP</a>. Acompanhando alguns tutoriais do <a href="http://tuliofaria.net">Tulio Faria</a>, estou vendo como é simples fazer a coisa acontecer com o Cake. Foi por isso que criei a categoria CakePHP aqui no blog. Quero, ao passo que for aprendendo, transmitindo isso para a comunidade.</p>
<p>Para mim é como se fosse aprender uma nova linguagem, pois não sou craque em orientação a objetos ainda. Mas como nada na vida vem de graça, a peleia é longa e a minha <em>bakery</em> está entrando em ação para colocar esse CakePHP para funcionar.</p>
]]></content:encoded>
			<wfw:commentRss>http://rafaelmarin.com.br/eu-quero-um-framework/feed/</wfw:commentRss>
		<slash:comments>13</slash:comments>
		</item>
		<item>
		<title>Negociação de conteúdo</title>
		<link>http://rafaelmarin.com.br/negociacao-de-conteudo/</link>
		<comments>http://rafaelmarin.com.br/negociacao-de-conteudo/#comments</comments>
		<pubDate>Tue, 03 Apr 2007 22:10:28 +0000</pubDate>
		<dc:creator>Rafael Marin</dc:creator>
				<category><![CDATA[HTTP]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[XHTML & HTML]]></category>

		<guid isPermaLink="false">http://rafaelmarin.com.br/2007/04/03/negociacao-de-conteudo/</guid>
		<description><![CDATA[Embora o XHTML devesse ser servido com o MIME application/xhtml-xml, nem todos os browsers estão aptos a entender este MIME Type. Neste contexto, técnicas de negociação de conteúdo &#8211; ou content negotiation em inglês &#8211; podem ser utilizadas para enviar ao agente de usuário diferentes MIME Types, de acordo com o que cada um deles aceita. A esmagadora maioria utiliza o MIME Type text/html para servir documentos XHTML, embora não seja a maneira correta. De acordo com a nota não-normativa da W3C, XHTML Media Types, &#8216;application/xhtml+xml&#8217; SHOULD be used for serving XHTML documents to XHTML user agents. Authors who wish to support both XHTML and HTML user agents MAY utilize content negotiation by serving HTML documents as &#8216;text/html&#8217; and XHTML [...]]]></description>
			<content:encoded><![CDATA[<p>Embora o <abbr title="eXtensible HiperText Markup Language">XHTML</abbr> devesse ser servido com o <acronym title="Multipurpose Internet Mail Extensions">MIME</acronym>  <code>application/xhtml-xml</code>, nem todos os browsers estão aptos a entender este MIME Type. Neste contexto, técnicas de negociação de conteúdo &#8211; ou <em>content negotiation</em> em inglês &#8211; podem ser utilizadas para enviar ao agente de usuário diferentes MIME Types, de acordo com o que cada um deles aceita.  A esmagadora maioria utiliza o MIME Type <code>text/html</code> para servir documentos XHTML, embora não seja a maneira correta. De acordo com a nota não-normativa da W3C, <a href="http://www.w3.org/TR/xhtml-media-types/" rel="external">XHTML Media Types</a>,</p>
<blockquote cite="http://www.w3.org/TR/xhtml-media-types/"><p> &#8216;application/xhtml+xml&#8217; SHOULD be used for serving XHTML documents to XHTML user agents.  Authors who wish to support both XHTML and HTML user agents MAY utilize content negotiation by serving HTML documents as &#8216;text/html&#8217; and XHTML documents as  &#8216;application/xhtml+xml&#8217;.</p></blockquote>
<p>Ou seja, o autor que deseja dar suporte tanto para user agents XHTML quanto para HTML, deve utilizar negociação de conteúdo para servir documentos com o MIME Type adequado a situação.  Um simples script em PHP resolve o problema:</p>
<p><code>&lt;?php<br />
if (stristr($_SERVER[HTTP_ACCEPT], "application/xhtml+xml") ||<br />
stristr($_SERVER["HTTP_USER_AGENT"], "W3C Validator")) {<br />
header("Content-Type: application/xhtml+xml; charset=iso-8859-1");<br />
header("Vary: Accept");<br />
echo("&lt;?xml version=\"1.0\" encoding=\"iso-8859-1\" ?&gt;\n");<br />
} else {<br />
header("Content-Type: text/html; charset=iso-8859-1");<br />
header("Vary: Accept");<br />
}<br />
?&gt;<br />
</code></p>
<p>O script verifica se o agente de usuário suporta o <code>application/xhtml+xml</code>, ou se o agente de usuário é o <a href="http://validator.w3.org" rel="external">W3C Validator</a>. Caso um deles seja verdadeiro, o documento é servido como <code>application/xhtml+xml</code>, caso contrário, ele é servido como <code>text/html</code>. Além disso, se um deles for verdadeiro, o documento recebe a declaração XML.</p>
<p>O cabeçalho <code>Vary: Accept</code> é enviado para que agentes intermediários de cache, como proxy servers, saibam que o MIME Type varia, de acordo com o suporte que o agente de usuário oferece.</p>
<p>O benefício disso tudo é que em browsers como Firefox e Mozilla, que suportam o MIME Type <code>application/xhtml+xml</code>, o código XHTML é tratado como XML no que se refere a intolerância a erros. Ou seja, se um documento XHTML, com MIME Type <code>application/xhtml+xml</code> possuir erros de sintaxe, estes browsers não irão mostrá-lo, assim como acontece com o XML inválido. Somente serão exibidos os documentos assim que os erros de sintaxe estiverem corrigidos. Assim, nem o W3C Validator é necessário para apontar erros.</p>
<h2>Veja também</h2>
<ul>
<li><a href="http://www.456bereastreet.com/archive/200408/content_negotiation/" rel="external">Content negotiation &#8211; 456 Berea Street</a></li>
<li><a href="http://www.456bereastreet.com/archive/200409/content_negotiation_adsense_and_comments/" rel="external">Content negotiation, AdSense, and comments &#8211; 456 Berea Street</a></li>
<li><a href="http://www.japs.etc.br/2006/03/content-negotiation/" rel="external">Content negotiation &#8211; Japs.etc.br</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://rafaelmarin.com.br/negociacao-de-conteudo/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

