<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>Blog do Pedro</title>
    <link>http://www.blogdopedro.net/</link>
    <description>Desenvolvimento web e um pouco mais</description>
    <item>
      <title>Jquery + Math + Flot (e html 5)</title>
      <link>http://www.blogdopedro.net/2010/05/28/Jquery-Math-Flot-e-html-5-</link>
      <description>Ola pessoal, fiz um pequeno projeto usando as cancalharias citadas no titulo. A id&#233;ia &#233; simples: montei alguns gr&#225;ficos usando as principais fun&#231;&#245;es trigonom&#233;tricas e recursos nativos do web browser. A tarefa em si j&#225; n&#227;o &#233; muito dificil, mas com as bibliotecas citadas ser torna coisa de crian&#231;a :-). E voc&#234; n&#227;o precisa de softwares matem&#225;ticos complexos para renderizar.

&lt;h3&gt;A Biblioteca Math&lt;/h3&gt;

A biblioteca Math j&#225; prov&#234; algumas (poucas) constantes e fun&#231;&#245;es que da a base para v&#225;rias coisa legais. N&#227;o tem nada de muito avan&#231;ado, mas j&#225; tem o b&#225;sico para come&#231;ar a brincadeira. Achei a seguinte tabela de refer&#234;ncia da biblioteca no site w3schools :

&lt;b&gt;
 Math Object Properties
 &lt;/b&gt;


&lt;table border=1 cellpadding=0 cellspacing=0 class=reference width=100%&gt;

  &lt;tbody&gt;

  &lt;tr&gt;

    &lt;th align=left&gt;

      Property

    &lt;/th&gt;

    &lt;th align=left&gt;

      Description

    &lt;/th&gt;

  &lt;/tr&gt;

  &lt;tr&gt;

    &lt;td&gt;

      &lt;a href=http://www.w3schools.com/jsref/jsref_e.asp&gt;E&lt;/a&gt;

    &lt;/td&gt;

    &lt;td&gt;

      Returns Euler's number (approx. 2.718)

    &lt;/td&gt;

  &lt;/tr&gt;

  &lt;tr&gt;

    &lt;td&gt;

      &lt;a href=http://www.w3schools.com/jsref/jsref_ln2.asp&gt;LN2&lt;/a&gt;

    &lt;/td&gt;

    &lt;td&gt;

      Returns the natural logarithm of 2 (approx. 0.693)

    &lt;/td&gt;

  &lt;/tr&gt;

  &lt;tr&gt;

    &lt;td&gt;

      &lt;a href=http://www.w3schools.com/jsref/jsref_ln10.asp&gt;LN10&lt;/a&gt;

    &lt;/td&gt;

    &lt;td&gt;

      Returns the natural logarithm of 10 (approx. 2.302)

    &lt;/td&gt;

  &lt;/tr&gt;

  &lt;tr&gt;

    &lt;td&gt;

      &lt;a href=http://www.w3schools.com/jsref/jsref_log2e.asp&gt;LOG2E&lt;/a&gt;

    &lt;/td&gt;

    &lt;td&gt;

      Returns the base-2 logarithm of E (approx. 1.442)

    &lt;/td&gt;

  &lt;/tr&gt;

  &lt;tr&gt;

    &lt;td&gt;

      &lt;a href=http://www.w3schools.com/jsref/jsref_log10e.asp&gt;LOG10E&lt;/a&gt;

    &lt;/td&gt;

    &lt;td&gt;

      Returns the base-10 logarithm of E (approx. 0.434)

    &lt;/td&gt;

  &lt;/tr&gt;

  &lt;tr&gt;

    &lt;td&gt;

      &lt;a href=http://www.w3schools.com/jsref/jsref_pi.asp&gt;PI&lt;/a&gt;

    &lt;/td&gt;

    &lt;td&gt;

      Returns PI (approx. 3.14159)

    &lt;/td&gt;

  &lt;/tr&gt;

  &lt;tr&gt;

    &lt;td&gt;

      &lt;a href=http://www.w3schools.com/jsref/jsref_sqrt1_2.asp&gt;SQRT1_2&lt;/a&gt;

    &lt;/td&gt;

    &lt;td&gt;

      Returns the square root of 1/2 (approx. 0.707)

    &lt;/td&gt;

  &lt;/tr&gt;

  &lt;tr&gt;

    &lt;td&gt;

      &lt;a href=http://www.w3schools.com/jsref/jsref_sqrt2.asp&gt;SQRT2&lt;/a&gt;

    &lt;/td&gt;

    &lt;td&gt;

      Returns the square root of 2 (approx. 1.414)

    &lt;/td&gt;

  &lt;/tr&gt;

  &lt;/tbody&gt;

&lt;/table&gt;

&lt;h2&gt;

  Math Object Methods

&lt;/h2&gt;

&lt;table border=1 cellpadding=0 cellspacing=0 class=reference width=100%&gt;

  &lt;tbody&gt;

  &lt;tr&gt;

    &lt;th align=left&gt;

      Method

    &lt;/th&gt;

    &lt;th align=left&gt;

      Description

    &lt;/th&gt;

  &lt;/tr&gt;

  &lt;tr&gt;

    &lt;td&gt;

      &lt;a href=http://www.w3schools.com/jsref/jsref_abs.asp&gt;abs(x)&lt;/a&gt;

    &lt;/td&gt;

    &lt;td&gt;

      Returns the absolute value of x

    &lt;/td&gt;

  &lt;/tr&gt;

  &lt;tr&gt;

    &lt;td&gt;

      &lt;a href=http://www.w3schools.com/jsref/jsref_acos.asp&gt;acos(x)&lt;/a&gt;

    &lt;/td&gt;

    &lt;td&gt;

      Returns the arccosine of x, in radians

    &lt;/td&gt;

  &lt;/tr&gt;

  &lt;tr&gt;

    &lt;td&gt;

      &lt;a href=http://www.w3schools.com/jsref/jsref_asin.asp&gt;asin(x)&lt;/a&gt;

    &lt;/td&gt;

    &lt;td&gt;

      Returns the arcsine of x, in radians

    &lt;/td&gt;

  &lt;/tr&gt;

  &lt;tr&gt;

    &lt;td&gt;

      &lt;a href=http://www.w3schools.com/jsref/jsref_atan.asp&gt;atan(x)&lt;/a&gt;

    &lt;/td&gt;

    &lt;td&gt;

      Returns the arctangent of x as a numeric value between -PI/2 and PI/2 radians

    &lt;/td&gt;

  &lt;/tr&gt;

  &lt;tr&gt;

    &lt;td&gt;

      &lt;a href=http://www.w3schools.com/jsref/jsref_atan.asp&gt;atan2(y,x)&lt;/a&gt;

    &lt;/td&gt;

    &lt;td&gt;

      Returns the arctangent of the quotient of its arguments

    &lt;/td&gt;

  &lt;/tr&gt;

  &lt;tr&gt;

    &lt;td&gt;

      &lt;a href=http://www.w3schools.com/jsref/jsref_ceil.asp&gt;ceil(x)&lt;/a&gt;

    &lt;/td&gt;

    &lt;td&gt;

      Returns x, rounded upwards to the nearest integer

    &lt;/td&gt;

  &lt;/tr&gt;

  &lt;tr&gt;

    &lt;td&gt;

      &lt;a href=http://www.w3schools.com/jsref/jsref_cos.asp&gt;cos(x)&lt;/a&gt;

    &lt;/td&gt;

    &lt;td&gt;

      Returns the cosine of x (x is in radians)

    &lt;/td&gt;

  &lt;/tr&gt;

  &lt;tr&gt;

    &lt;td&gt;

      &lt;a href=http://www.w3schools.com/jsref/jsref_exp.asp&gt;exp(x)&lt;/a&gt;

    &lt;/td&gt;

    &lt;td&gt;

      Returns the value of E&lt;sup&gt;x&lt;/sup&gt;

    &lt;/td&gt;

  &lt;/tr&gt;

  &lt;tr&gt;

    &lt;td&gt;

      &lt;a href=http://www.w3schools.com/jsref/jsref_floor.asp&gt;floor(x)&lt;/a&gt;

    &lt;/td&gt;

    &lt;td&gt;

      Returns x, rounded downwards to the nearest integer

    &lt;/td&gt;

  &lt;/tr&gt;

  &lt;tr&gt;

    &lt;td&gt;

      &lt;a href=http://www.w3schools.com/jsref/jsref_log.asp&gt;log(x)&lt;/a&gt;

    &lt;/td&gt;

    &lt;td&gt;

      Returns the natural logarithm (base E) of x

    &lt;/td&gt;

  &lt;/tr&gt;

  &lt;tr&gt;

    &lt;td&gt;

      &lt;a href=http://www.w3schools.com/jsref/jsref_max.asp&gt;max(x,y,z,...,n)&lt;/a&gt;

    &lt;/td&gt;

    &lt;td&gt;

      Returns the number with the highest value

    &lt;/td&gt;

  &lt;/tr&gt;

  &lt;tr&gt;

    &lt;td&gt;

      &lt;a href=http://www.w3schools.com/jsref/jsref_min.asp&gt;min(x,y,z,...,n)&lt;/a&gt;

    &lt;/td&gt;

    &lt;td&gt;

      Returns the number with the lowest value

    &lt;/td&gt;

  &lt;/tr&gt;

  &lt;tr&gt;

    &lt;td&gt;

      &lt;a href=http://www.w3schools.com/jsref/jsref_pow.asp&gt;pow(x,y)&lt;/a&gt;

    &lt;/td&gt;

    &lt;td&gt;

      Returns the value of x to the power of y

    &lt;/td&gt;

  &lt;/tr&gt;

  &lt;tr&gt;

    &lt;td&gt;

      &lt;a href=http://www.w3schools.com/jsref/jsref_random.asp&gt;random()&lt;/a&gt;

    &lt;/td&gt;

    &lt;td&gt;

      Returns a random number between 0 and 1

    &lt;/td&gt;

  &lt;/tr&gt;

  &lt;tr&gt;

    &lt;td&gt;

      &lt;a href=http://www.w3schools.com/jsref/jsref_round.asp&gt;round(x)&lt;/a&gt;

    &lt;/td&gt;

    &lt;td&gt;

      Rounds x to the nearest integer

    &lt;/td&gt;

  &lt;/tr&gt;

  &lt;tr&gt;

    &lt;td&gt;

      &lt;a href=http://www.w3schools.com/jsref/jsref_sin.asp&gt;sin(x)&lt;/a&gt;

    &lt;/td&gt;

    &lt;td&gt;

      Returns the sine of x (x is in radians)

    &lt;/td&gt;

  &lt;/tr&gt;

  &lt;tr&gt;

    &lt;td&gt;

      &lt;a href=http://www.w3schools.com/jsref/jsref_sqrt.asp&gt;sqrt(x)&lt;/a&gt;

    &lt;/td&gt;

    &lt;td&gt;

      Returns the square root of x

    &lt;/td&gt;

  &lt;/tr&gt;

  &lt;tr&gt;

    &lt;td&gt;

      &lt;a href=http://www.w3schools.com/jsref/jsref_tan.asp&gt;tan(x)&lt;/a&gt;

    &lt;/td&gt;

    &lt;td&gt;

      Returns the tangent of an angle

    &lt;/td&gt;

  &lt;/tr&gt;

  &lt;/tbody&gt;

&lt;/table&gt;

&lt;small&gt; Fonte: http://www.w3schools.com/jsref/jsref_obj_math.asp &lt;/small&gt;

&lt;h3&gt;Jquery e Flot&lt;/h3&gt;


A biblioteca Flot &#233; uma biblioteca para plotagem de gr&#225;ficos que promete funcionar em v&#225;rios browsers (inclusive IE6), usando o t&#227;o falado HTML Canvas do HTML 5. Em browsers mais antigos (como o IE6) eles usam uma simula&#231;&#227;o canvas tamb&#233;m via JS. Para maiores informa&#231;&#245;es, visite a p&#225;gina oficial do projeto http://code.google.com/p/flot/ .&lt;br&gt;


&lt;h3&gt;Alguns gr&#225;ficos de fun&#231;&#245;es&lt;/h3&gt;

&lt;b&gt; Cos, sin, tan, cotan, sec, cossec:&lt;/b&gt;


&lt;div id=ypuq style=TEXT-ALIGN:center&gt;

  &lt;img src="http://lh5.ggpht.com/_gMGOvKSyf40/TACUs_UVGCI/AAAAAAAAARs/zlsvthLHBRI/s800/dw8vnqp_8285dzxwhk_b.png"&gt;

&lt;/div&gt;


&lt;b&gt; Parabola, Parabola (inv), Cubic, Log, Abs:
 &lt;/b&gt;


&lt;div id=blmp style=TEXT-ALIGN:center&gt;

  &lt;img src="http://lh3.ggpht.com/_gMGOvKSyf40/TACUtL66nCI/AAAAAAAAARw/rXYoj4fyiVY/s800/dw8vnqp_87d6gx44dm_b.png" &gt;

&lt;/div&gt;


&lt;b&gt; cos * (1/x) :&lt;/b&gt;


&lt;div style=TEXT-ALIGN:center&gt;

    &lt;img src="http://lh3.ggpht.com/_gMGOvKSyf40/TACUtdTRDHI/AAAAAAAAAR0/t9ZOqHNB_vg/s800/dw8vnqp_88gcvq3fg7_b.png"&gt;
&lt;/div&gt;


&lt;b&gt;
 cos(1/sin(x)) , sin(1/cos(x)):
 &lt;/b&gt;


&lt;div id=zl6o style=TEXT-ALIGN:center&gt;

  &lt;img src="http://lh6.ggpht.com/_gMGOvKSyf40/TACUtQUkB1I/AAAAAAAAAR4/FLwniivEL6Q/s800/dw8vnqp_89ffwqw2c9_b.png"&gt;

&lt;/div&gt;


Para quem se interessou, coloquei todos os arquivos com os gr&#225;ficos acima no meu github - http://github.com/pedrolopesme/Flot-Samples. Coloquei l&#225; um livedemo que voc&#234; passa a fun&#231;&#227;o e ele constr&#243;i o gr&#225;fico. Se algu&#233;m se habilitar em fazer uma coisa mais legal para plotagem de gr&#225;ficos de fun&#231;&#245;es rodando direto via browser, entre em contato :-)</description>
      <guid>/</guid>
    </item>
    <item>
      <title>Off - Ajuda a desabrigados no Rio ap&#243;s temporal</title>
      <link>http://www.blogdopedro.net/2010/04/07/off-ajuda-a-desabrigados-no-rio-apos-temporal</link>
      <description>Pessoal, desculpem o off, mas &#233; que a situa&#231;&#227;o esta critica: ap&#243;s as &lt;a href="http://colunas.g1.com.br/aovivo/category/rio-de-janeiro/"&gt;chuvas torrenciais que atingiram o Rio de Janeiro&lt;/a&gt;, muitos lugares da nossa "cidade maravilhosa" (???) ficaram alagados, houveram deslizamentos, mortes e muita gente desabrigada. E um lugar que houve a grande parte dessas trag&#233;dias foi o Jardim Maravilha - Guaratiba. Vou anexar algumas fotos no fim do post, mas a id&#233;ia &#233; pedir ajuda a quem puder dar uma m&#227;o pra galera de l&#225;. 

Umas das formas de ajudar esse lugar &#233; atrav&#233;s do Instituto Beritz, que tem um trabalho de a&#231;&#227;o social j&#225; nesta regi&#227;o e esta trabalhando no suporte as pessoas que sofreram nesses dias de chuva. O problema &#233; que a demanda de necessidade das pessoas nesse local aumentou muito - excedendo as capacidades do instituto. Segue um email que acabei de receber de um amigo que apoia o instituto: 

&lt;blockquote&gt;Acabamos de entrar em contado com uma Agente de Sa&#250;de que est&#225; ajudando aos desabrigados do Jardim Maravilha e ela nos informou que as pessoas ainda est&#227;o chegando faltam muitas coisas.

Est&#225; come&#231;ando a fazer frio e existem muitas crian&#231;as em meio a fam&#237;lias que perderam tudo.
As maiores necessidades s&#227;o:
-Materiais para Dormir
-Materiais para Higiene Pessoal
-Materiais para as muitas crian&#231;as.

Exemplos:
-Colchonete
-Cobertor
-Roupa de Cama
-Leite para Crian&#231;as
-Frauda Descart&#225;vel
-Roupas (infantil e Adulta)
-Cal&#231;ados (infantil e Adulto)
-Sabonete
-Escova de Dente
-Absorvente
-Desodorante
-Toalha de Banho
-ETC.....
 
Atenciosamente,
 
Seguem algumas fotos em ANEXO.

 
Para mais informa&#231;&#245;es sobre como contribuir:
 

alt
Instituto Beritz
www.institutoberitz.com
secretaria@institutoberitz.com
(21) 2412-9072
Rua Palm&#225;cia, 95 - 23087-420
Pedra Angula - Campo Grande 
Rio de Janeiro - RJ - Brasil&lt;/blockquote&gt;

&lt;div align="center"&gt;
&lt;img src="http://farm5.static.flickr.com/4012/4501235191_1db42fa42c_m.jpg"&gt;&lt;img src="http://farm3.static.flickr.com/2459/4501869144_35567bea6b_m.jpg"&gt;&lt;img src="http://farm5.static.flickr.com/4038/4501869072_6a1efec05c_m.jpg"&gt;&lt;img src="http://www.flickr.com/photos/35687377@N05/4501868992/"&gt;&lt;img src="http://www.flickr.com/photos/35687377@N05/4501868896/"&gt;

Fotos em melhor resolu&#231;&#227;o no &lt;a href=""&gt;meu flickr&lt;/a&gt; 
&lt;/div&gt;</description>
      <guid>/</guid>
    </item>
    <item>
      <title>Instalando o CouchDB no Archlinux</title>
      <link>http://www.blogdopedro.net/2010/04/06/instalando-o-couchdb-no-archlinux</link>
      <description>&lt;img style="float:left;cursor:hand;height:100px;margin:0 10px 10px 0;" src="http://4.bp.blogspot.com/_gMGOvKSyf40/SXCNb_p2q6I/AAAAAAAAAMg/L0Tn35Jz240/s400/Couchdb-logo.png" border="0" /&gt;Falando mais uma vez no CouchDB, decidi fazer um passo-a-passo para instala&#231;&#227;o do mesmo no Archlinux. Como no Wiki do projeto n&#227;o existe um guia de instala&#231;&#227;o nesta distro (no donuts for you), resolvi eu mesmo fazer um. Ao longo da instala&#231;&#227;o do CouchDB no meu PC, foi fazendo log de tudo e montei o tutorial abaixo:

&lt;br /&gt;&lt;h3&gt; Resolvendo as depend&#234;ncias: &lt;/h3&gt;

O Couch precisa dos pacotes abaixo. Felizmente, todas as depend&#234;ncias est&#227;o no reposit&#243;rio oficial do Arch. Como root instale:

&lt;ul style="width: 400px;"&gt;
    &lt;li&gt;Curl &lt;code&gt;pacman -S curl&lt;/code&gt; &lt;/li&gt;
    &lt;li&gt;Spidermonkey &lt;code&gt;pacman -S spidermonkey&lt;/code&gt; &lt;/li&gt;
    &lt;li&gt;Erlang &lt;code&gt;pacman -S erlang&lt;/code&gt; &lt;/li&gt;
    &lt;li&gt;ICU &lt;code&gt;pacman -S icu&lt;/code&gt; &lt;/li&gt;
    &lt;li&gt;Automake &lt;code&gt;pacman -S automake&lt;/code&gt; &lt;/li&gt;
    &lt;li&gt;Autoconf &lt;code&gt;pacman -S autoconf&lt;/code&gt; &lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt; Instalando o Couch &lt;/h3&gt;

Uma vez instalado todas as depend&#234;ncias, vamos ao Couch propriamente dito. Primeiro, temos que baixar o source :

&lt;code&gt;wget http://ftp.unicamp.br/pub/apache/couchdb/0.11.0/apache-couchdb-0.11.0.tar.gz
tar xf apache-couchdb-0.11.0.tar.gz
cd apache-couchdb-0.11.0&lt;/code&gt;

Caso o link acima do Couch n&#227;o esteja funcionando ou voc&#234; queira outra vers&#227;o, acesse a p&#225;gina de &lt;a href="http://couchdb.apache.org/downloads.html" target="_blank"&gt; downloads &lt;/a&gt; do Couch e repita os passos acima com a vers&#227;o desejada.

Agora &#233; configurar e instalar:
&lt;code&gt;configure -prefix=/
make&lt;/code&gt;

e finalmente como root:
&lt;code&gt;sudo make install&lt;/code&gt;

Fazendo isso o couchdb j&#225; estara instalado. Agora, precisamos criar um usu&#225;rio e dar as permiss&#245;es necess&#225;rias:
&lt;code&gt;sudo useradd couchdb
sudo chown -R couchdb:root /var/log/couchdb
sudo chown -R couchdb:root /var/lib/couchdb&lt;/code&gt;

Para facilitar sua vida adicione o Couch na bandeja de inicializa&#231;&#227;o do sistema. Como root, abra o arquivo /etc/rc.conf e adicione o couchdb nos DAEMONS
&lt;code&gt;DAEMONS=( ... couchdb ... )&lt;/code&gt;

Pronto. Seu CouchDB esta instalando e na bandeja de inicializa&#231;&#227;o. Parr ver n&#227;o ter que reiniciar
o computador para ver o Couch rodando, inicie-o manualmente com o comando:
&lt;code&gt;/etc/rc.d/couchdb start&lt;/code&gt;

Agora v&#225; no browser e acesse o Futon atrav&#233;s do endere&#231;o http://localhost:5984/_utils/ . Desse ponto em diante ser&#225; tema para outros posts!</description>
      <guid>/</guid>
    </item>
    <item>
      <title>Tradu&#231;&#227;o do artigo sobre Integra&#231;&#227;o Cont&#237;nua</title>
      <link>http://www.blogdopedro.net/2009/03/04/traducao-do-artigo-sobre-integracao-continua</link>
      <description>&lt;blockquote&gt;&lt;em&gt;O texto abaixo &#233; a uma tradu&#231;&#227;o autorizada do artigo escrito pelo Martin Fowler. Para acessar a vers&#227;o original em ingl&#234;s, &lt;a href="http://martinfowler.com/articles/continuousIntegration.html" target="_blank"&gt; clique aqui &lt;/a&gt;. Caso voc&#234; tenha sujest&#245;es para tornar a tradu&#231;&#227;o melhor, compartilhe atrav&#233;s da se&#231;&#227;o de coment&#225;rios no final da p&#225;gina.&lt;/em&gt;

&lt;em&gt;The text bellow is an authorized translation of the article written by Martin Fowler. To access the original english version, &lt;a href="http://martinfowler.com/articles/continuousIntegration.html" target="_blank"&gt; click here &lt;/a&gt;. If you have any sujestion to make the translation better, share it via comments section at the end of the page.&lt;/em&gt;&lt;/blockquote&gt;

&lt;h3&gt;Construindo um componente usando Integra&#231;&#227;o Continua&lt;/h3&gt;
Para mim, a forma mais f&#225;cil de explicar o que Integra&#231;&#227;o Cont&#237;nua (IC) &#233; e como trabalha &#233; mostrando um pequeno exemplo de como isso funciona com o desenvolvimento de uma pequena parte do sistema. Vamos assumir que eu tenho que fazer alguma coisa para uma parte do sistema, n&#227;o importa realmente que tarefa &#233; - por enquanto vou supor que isso &#233; pequeno e que pode ser feito um poucas horas ( vamos explorar tarefas maiores e outros problemas mais tarde ). Come&#231;o pegando uma c&#243;pia atual do c&#243;digo fonte e colocando na minha m&#225;quina de desenvolvimento. Fa&#231;o isso utilizando um sistema de controle de c&#243;digo para ter uma c&#243;pia de trabalho a partir do c&#243;digo principal.

O par&#225;grafo acima ir&#225; fazer sentido para pessoas que usam sistema de controle de c&#243;digo, mas n&#227;o ser&#225; para aqueles que n&#227;o usam. Ent&#227;o deixe-me explicar rapidamente: um sistema de controle de c&#243;digo mant&#233;m todo o c&#243;digo fonte de um projeto em um reposit&#243;rio. O estado atual  do sistema geralmente &#233; chamado de mainline( ou linha principal). Em qualquer momento um desenvolvedor pode fazer uma c&#243;pia da vers&#227;o principal em sua m&#225;quina, e isso &#233; chamado de check out. A c&#243;pia em uma m&#225;quina de um desenvolvedor &#233; chamada de c&#243;pia de trabalho (na maior parte de tempo voc&#234; estar&#225; atualizando sua c&#243;pia de trabalho junto a principal).

Agora eu pego minha c&#243;pia de trabalho e fa&#231;o o que preciso para completar minha tarefa. Isso ir&#225; consistir em alterar o c&#243;digo de produ&#231;&#227;o e tamb&#233;m adicionar ou alterar os testes automatizados. Integra&#231;&#227;o Cont&#237;nua assume um alto n&#237;vel de testes que s&#227;o automatizados no software: uma facilidade que eu chamo de &lt;a href="http://www.martinfowler.com/bliki/SelfTestingCode.html" target="_blank"&gt;self-testing code&lt;/a&gt; ( ou c&#243;digo auto-test&#225;vel). Frequentemente estes usam uma vers&#227;o da popular framework de teste xUnit.

Um vez que eu terminei (e isso geralmente acontece em v&#225;rios lugares quando eu estou trabalhando), eu fa&#231;o uma build (ou desenvolvimento de uma vers&#227;o) automatizada na minha m&#225;quina de desenvolvimento. Assim, o c&#243;digo fonte em minha c&#243;pia de trabalho &#233; pego, compilado e transformado em um execut&#225;vel - e ent&#227;o &#233; executado os testes autom&#225;ticos. Somente se todas as builds e testes n&#227;o tiverem erros que tudo ser&#225; considerado bom.

Com uma boa build, eu posso ent&#227;o pensar em colocar minhas altera&#231;&#245;es no reposit&#243;rio. A quest&#227;o &#233;, claro, que outras pessoas podem fazer (e geralmente fazem) mudan&#231;as na vers&#227;o principal antes de eu ter a chance de fazer um commit ( ou atualizar o reposit&#243;rio principal com a minha vers&#227;o do c&#243;digo). Sendo assim, primeiro eu atualizo minha c&#243;pia de trabalho com as mudan&#231;as feitas pelos outros e crio uma nova build. Se as mudan&#231;as deles chocarem com as minhas mudan&#231;as, ser&#225; exibido erros tanto na compila&#231;&#227;o quanto nos testes. Neste caso &#233; minha a responsabilidade de corrigir estes erros e repetir o processo at&#233; que minha c&#243;pia local esteja sincronizada com a vers&#227;o principal.

Uma vez que tenho as altera&#231;&#245;es na minha pr&#243;pria build de uma c&#243;pia devidamente sincronizada eu posso finalmente fazer o commit na vers&#227;o principal, que atualiza o reposit&#243;rio. Entretanto meu commit n&#227;o termina meu trabalho. N&#243;s fazemos uma build novamente, mas agora em uma maquina de integra&#231;&#227;o baseada na vers&#227;o principal do c&#243;digo. Somente com o sucesso desta build poderemos dizer que as minhas altera&#231;&#245;es foram feitas. Sempre existe uma chance de eu ter esquecido alguma coisa na minha m&#225;quina e o reposit&#243;rio n&#227;o ser atualizado corretamente. Somente quando minha build de altera&#231;&#245;es for lan&#231;ada com sucesso na m&#225;quina de integra&#231;&#227;o &#233; que o meu trabalho terminou. A build de integra&#231;&#227;o pode ser executada manualmente por mim ou ser feita automaticamente usando o Cruise.

Se um choque ocorrer entre as vers&#245;es de dois desenvolvedores, isso geralmente &#233; pego quando o segundo desenvolvedor atualizar sua c&#243;pia local com as builds feitas pelos outros. Caso n&#227;o, a build de integra&#231;&#227;o deve falhar. De qualquer modo o erro &#233; detectado rapidamente. Nesse momento a tarefa mais importante &#233; consertar os problemas, e fazer sua build voltar a funcionar corretamente. Em um ambiente de Integra&#231;&#227;o Cont&#237;nua voc&#234; nunca deve ter uma build de integra&#231;&#227;o com falhas por muito tempo. Um bom time deve ter muitas builds corretas por dia. M&#225;s builds podem ocorrer de tempos em tempos, mas devem ser consertadas rapidamente.
&lt;h2&gt;Pr&#225;ticas da Integra&#231;&#227;o Cont&#237;nua&lt;/h2&gt;
A hist&#243;ria anterior &#233; uma apresenta&#231;&#227;o da Integra&#231;&#227;o Cont&#237;nua e de como ela funciona diariamente. Colocar isso tudo pra funcionar sem problemas envolve obviamente mais coisas do que foi dito. Eu vou focar agora em pr&#225;ticas chaves que efetivar&#227;o a IC .
&lt;h3&gt;Manter um &#250;nico reposit&#243;rio de c&#243;digo.&lt;/h3&gt;
Projetos de softwares envolvem  v&#225;rios arquivos que precisam serem "orquestrados" juntos para se construir um produto. Manter todos esse arquivos exige um grande esfor&#231;o, particularmente quando existem v&#225;rias pessoas envolvidas. Logo n&#227;o &#233; surpresa que atrav&#233;s de anos equipes de desenvolvimento tem constru&#237;do ferramentas para gerenciar tudo isso. Estas ferramentas - chamadas de ferramentas de gerenciamento de c&#243;digo fonte, gerenciamento de configura&#231;&#227;o, sistema de controle de vers&#227;o, reposit&#243;rios ou outros nomes - s&#227;o uma parte integrante na maioria dos projetos de desenvolvimento. A triste e surpreendente quest&#227;o &#233; que essas ferramentas n&#227;o fazem parte de todos os projetos. Isto &#233; raro, mas eu participo de projetos que n&#227;o usam algo como um sistema mas usam um combina&#231;&#227;o confusa de drivers locais e compartilhados.

Portanto, como um passo fundamental, tenha certeza de usar um sistema decente de controle de c&#243;digo fonte. Custo n&#227;o &#233; um problema por causa da boa qualidade das ferramentas open-source dispon&#237;veis. O reposit&#243;rio open-source atual que escolho &#233; o &lt;a href="http://subversion.tigris.org/" target="_blank"&gt;Subversion&lt;/a&gt; ( o antigo &lt;a href="http://www.nongnu.org/cvs/" target="_blank"&gt;CVS&lt;/a&gt; continua sendo usado largamente,  e ainda &#233; bem melhor que nada, mas o Subversion &#233; uma escolha moderna). &#201; interessante como eu converso com desenvolvedores e descubro que a maioria dos gerenciadores de c&#243;digo fonte comerciais s&#227;o menos aceitos que o Subversion. A &#250;nica ferramenta que eu tenho ouvido pessoas falarem que &#233; digna de ser paga &#233; o &lt;a href="http://www.perforce.com/" target="_blank"&gt;Perforce&lt;/a&gt;.

Uma vez que voc&#234; tenha um sistema de gerenciamento de c&#243;digo fonte, tenha certeza de que isso esteja em um lugar conhecido por todos, para pagarem o c&#243;digo fonte. Ningu&#233;m deve sequer perguntar "Onde est&#227;o os arquivos?". Tudo deve estar no reposit&#243;rio.

Embora muitos times usem reposit&#243;rios, um erro comum que vejo &#233; que eles n&#227;o colocam tudo no reposit&#243;rio. Se as pessoas usam um reposit&#243;rio, eles v&#227;o por o c&#243;digo l&#225;, mas tudo que voc&#234; precisa para fazer uma build deve estar inclu&#237;do la: scripts de teste, arquivos de configura&#231;&#227;o, esquema de banco de dados, scripts de instala&#231;&#227;o e bibliotecas de terceiros. Eu conheci projetos que colocavam seus compiladores no reposit&#243;rio (importante nos dias antigos de v&#225;rios compiladores de C++). O regra b&#225;sica &#233; que voc&#234; consiga por o projeto em uma m&#225;quina virgem, fazer um checkout (ou pegar uma c&#243;pia de todo o c&#243;digo) e conseguir rodar o sistema completamente. Somente poucas coisas devem ser feitas na m&#225;quina virgem - geralmente coisas que s&#227;o est&#225;veis, grandes e complicadas de instalar . Um sistema operacional, ambiente de desenvolvimento Java ou sistema b&#225;sico de banco de dados s&#227;o exemplos t&#237;picos.

Voc&#234; precisa por tudo que a build precisa no sistema de controle de c&#243;digo, entretanto voc&#234; pode por tamb&#233;m outros materiais com que as pessoas geralmente trabalham. Configura&#231;&#245;es de IDE s&#227;o boas para colocar l&#225; porque este &#233; um modo f&#225;cil para as pessoas compartilharem as mesmas configura&#231;&#245;es.

Outra caracter&#237;stica dos sistemas de controle de vers&#227;o &#233; que eles permitem voc&#234; criar m&#250;ltiplos branches (ou linhas de desenvolvimento) , para manipular diferentes fluxos de desenvolvimento. Isso &#233; uma caracter&#237;stica &#250;til, quer dizer essencial  - mas frequentemente &#233; usada de maneira abusiva o que coloca as pessoas em problemas. Reserve-se a usar os branches ao m&#237;nimo. Tenha uma vers&#227;o principal: um &#250;nico branch do projeto atualmente em desenvolvimento. Basicamente todos devem trabalhar fora desta linha principal a maior parte do tempo ( um n&#250;mero consider&#225;vel de branches s&#227;o corre&#231;&#227;o de bugs de uma vers&#227;o futura e experimentos tempor&#225;rios).

Geralmente voc&#234; deve guardar no controle de c&#243;digo tudo que voc&#234; precisa para executar tudo, mas nada do que voc&#234; j&#225; executou. Algumas pessoas guardam os produtos das builds no controle de c&#243;digo, mas eu considero que isso &#233; um sinal, uma indica&#231;&#227;o de um problema mais profundo, geralmente uma incapacidade para recriar as builds confiantemente.
&lt;h3&gt;Automatize a Build&lt;/h3&gt;
Frequentemente pegar os fontes e transform&#225;-los em um sistema rodando  &#233; um processo complicado envolvendo compila&#231;&#227;o, movimenta&#231;&#227;o de arquivos, carregar schemas nas bases de dados e por ai vai. Entretanto, boa parte das tarefas nesta parte do desenvolvimento de software pode ser automatizada - e portanto deve ser automatizada. Pedir pessoas para digitarem comandos estranhos ou clicar em caixas de dialogo &#233; uma perda de tempo e uma forma suscet&#237;vel a reprodu&#231;&#227;o de erros.

Ambientes automatizados de builds s&#227;o caracter&#237;sticas comuns de sistemas. O mundo Unix tem feito isso h&#225; d&#233;cadas, a comunidade Java desenvolveu o Ant, a comunidade .NET desenvolveu o Nant e agora tem o MSBuild. Esteja certo de que voc&#234; pode gerar e lan&#231;ar o seu sistema rodando os scripts em um &#250;nico comando. Um erro comum &#233; n&#227;o colocar tudo na build automatizada. A build deve incluir pegar o schema do banco de dados do reposit&#243;rio e coloc&#225;-lo no ambiente de execu&#231;&#227;o. Eu vou elaborar minha regra anterior: qualquer um deve ser capaz de ir para uma m&#225;quina virgem, pegar as fontes do reposit&#243;rio, emitir um &#250;nico comando e ter um sistema rodando na sua m&#225;quina.

Scripts de build podem ter varias formas e  frequentemente s&#227;o  particulares a uma plataforma ou comunidade, mas eles n&#227;o necessariamente ter que ser assim. Embora a maioria dos nossos projetos s&#227;o em Java e usam o Ant, alguns tem usando Ruby ( o sistema Ruby Rake &#233; um script build muito bom). N&#243;s tivemos bons resultados automatizando um projeto anterior usando Microsoft COM com o Ant.

Dependendo do que voc&#234; precisa, voc&#234; pode querer que diferentes tipos de coisas estejam na build. Voc&#234; lan&#231;ar um sistema com ou sem c&#243;digo de teste, ou com diferentes conjuntos de testes. Alguns componentes podem ser constru&#237;dos isoladamente. Um script de build deve permitir voc&#234; usar m&#233;todos alternativos em casos diferentes.
Muitos de n&#243;s usamos IDEs, e a maioria das IDEs tem algum tipo de processo de gerenciamento de build dentro delas. Entretanto esses arquivos s&#227;o sempre propriet&#225;rios a IDE e frequentemente fr&#225;geis. Al&#233;m disso eles necessitam da IDE para funcionar. N&#227;o existe problema se os usu&#225;rios da IDE configurarem seus pr&#243;prios arquivos de projetos e usarem para o desenvolvimento individual. Entretanto  &#233; essencial ter uma build principal que &#233; us&#225;vel em um servidor e execut&#225;vel a partir de outros scripts. Logo, em um projeto Java n&#243;s estamos livres para ter desenvolvedores fazendo a build em seus IDEs, mas a build principal deve usar o Ant para assegurar que isso possa rodar um servidor de desenvolvimento.
&lt;h3&gt;Fa&#231;a sua Build ser auto-test&#225;vel&lt;/h3&gt;
Tradicionalmente uma build significa compila&#231;&#227;o, linkagem e todo o material adicional necess&#225;rio para ter um programa executando. Um programa pode rodar, mas isso n&#227;o significa que foi feito da maneira certa. Linguagens modernas estaticamente tipadas podem achar muitos bugs, mas alguma coisa pode acabar passando desapercebida. Um bom modo para pegar erros mais r&#225;pida e eficientemente &#233; incluir testes autom&#225;ticos no processo de build. Testes n&#227;o s&#227;o perfeitos (claro), mas eles podem pegar muitos bugs - o suficiente para ser &#250;til.

Leitores regulares do meu trabalho ir&#227;o notar que sou um grande f&#227; de TDD e XP, entretanto eu quero ressaltar que nenhuma dessas abordagens s&#227;o necess&#225;rias para ganhar os benef&#237;cios de um c&#243;digo auto-test&#225;vel. Ambas as abordagens acertam que se escreva testes antes que voc&#234; escreva o c&#243;digo, para ent&#227;o fazer os testes passarem - desta forma os testes exploram muito mais o design do sistema do que capturam erros. Isto &#233; uma coisa boa, mas n&#227;o &#233; necessariamente do prop&#243;sito da IC, onde n&#243;s temos  requisitos mais fracos de c&#243;digo auto-test&#225;vel (embora TDD &#233; minha maneira preferida de produzir c&#243;digo auto-test&#225;vel).

Para ter o c&#243;digo auto-test&#225;vel voc&#234; necessitar&#225; de uma suite de testes automatizados que possa checar uma grande parte da base do c&#243;digo para achar problemas. Os testes necessitam estar aptos para rodarem com um simples comando e serem checados automaticamente. O resultado da suite dos testes em execu&#231;&#227;o deve indicar se estes falharam. Para uma build ser auto-test&#225;vel a falha de um teste deve fazer com que a build falhe.
Atrav&#233;s dos &#250;ltimos anos em que o TDD tem crescido, ele popularizou a fam&#237;lia de ferramentas open-source &lt;a href="http://www.martinfowler.com/bliki/Xunit.html" target="_blank"&gt;xUnit&lt;/a&gt; que s&#227;o ideais para esse tipo de teste. As ferramentas xUnit tem sido muito valorosa para n&#243;s na ThoughtWorks e eu sempre sugiro as pessoas que as usem. Estas ferramentas, que teve Kent Beck como pioneiro, tornam f&#225;cil para voc&#234; configurar um ambiente completo para testes automatizados.

Ferramentas xUnit s&#227;o certamente o ponto inicial para tornar seu c&#243;digo auto-test&#225;vel. Voc&#234; deve tamb&#233;m procurar por outras ferramentas que focam em testes mais voltados ao software em funcionamento. Atualmente, existem um grande n&#250;mero delas, incluindo &lt;a href="http://fit.c2.com/" target="_blank"&gt;FIT&lt;/a&gt;, &lt;a href="http://www.openqa.org/selenium/" target="_blank"&gt;Selenium&lt;/a&gt;, &lt;a href="http://sahi.sourceforge.net/" target="_blank"&gt;Sahi&lt;/a&gt;, &lt;a href="http://wtr.rubyforge.org/" target="_blank"&gt;Watir&lt;/a&gt;, &lt;a href="http://fitnesse.org/" target="_blank"&gt;FITnesse&lt;/a&gt; e muitas outras que eu n&#227;o vou listar aqui.
&lt;h3&gt;Cada um lan&#231;a suas modifica&#231;&#245;es todos os dias.&lt;/h3&gt;
Integra&#231;&#227;o antes de tudo trata sobre comunica&#231;&#227;o. Integra&#231;&#227;o permite os desenvolvedores dizerem uns aos outros sobre as altera&#231;&#245;es que eles fizeram. Frequentemente comunica&#231;&#227;o permite pessoas descobrirem  rapidamente como as altera&#231;&#245;es aconteceram.

O &#250;nico pr&#233;-requisito para um desenvolvedor lan&#231;ar suas altera&#231;&#245;es na vers&#227;o principal &#233; que ele ele consiga executar perfeitamente o c&#243;digo. Isso claro, inclui passar pelos testes da build. Como com qualquer ciclo de lan&#231;amento de c&#243;digo, o desenvolvedor primeiro atualiza sua c&#243;pia de trabalho para coincidir com a vers&#227;o principal, resolve qualquer conflito e ent&#227;o gera a build em sua m&#225;quina local. Se a build passar, ent&#227;o ele estar&#225; liberado para lan&#231;ar suas altera&#231;&#245;es na vers&#227;o principal.

Fazendo isso frequentemente, os desenvolvedores ir&#227;o encontrar rapidamente se existe algum conflito entre as vers&#245;es. O segredo para solucionar problemas rapidamente &#233; encontr&#225;-los rapidamente. Com desenvolvedores lan&#231;ando suas altera&#231;&#245;es a cada hora, um conflito pode ser detectado dentro de poucas horas desde seu acontecimento, e em um ponto n&#227;o muito avan&#231;ado - o que o torna f&#225;cil de ser solucionado. Conflitos que n&#227;o s&#227;o detectados por semanas podem ser dif&#237;ceis de serem resolvidos.

O fato de que voc&#234; gerou uma build quando voc&#234; atualizou sua c&#243;pia de trabalho significa que voc&#234; detectou os problemas de compila&#231;&#227;o como tamb&#233;m conflitos textuais. Desde que a build seja auto-test&#225;vel, voc&#234; tamb&#233;m detecta conflitos no c&#243;digo em execu&#231;&#227;o. Os &#250;ltimos conflitos s&#227;o conflitos particularmente inc&#244;modos de se encontrar se eles persistirem n&#227;o detectados por um longo tempo em seu c&#243;digo. Desde que existam apenas algumas horas de diferen&#231;a entre os commits, existem apenas alguns locais onde o problema pode estar se escondendo. Al&#233;m disso, desde que muita coisa n&#227;o tenha sido mudada, voc&#234; pode usar um &lt;a href="http://www.martinfowler.com/bliki/DiffDebugging.html" target="_blank"&gt;diff-debugging&lt;/a&gt; para lhe ajudar a encontrar o problema.

Minha regra geral &#233; que cada desenvolvedor deve atualizar o reposit&#243;rio todo dia. Na pr&#225;tica,  geralmente &#233; &#250;til  os desenvolvedores lan&#231;arem suas atualiza&#231;&#245;es com mais frequ&#234;ncia que uma vez ao dia. Quanto mais frequentemente voc&#234; fizer um commit, menos lugares voc&#234; ter&#225; que procurar por erros de conflito, e mais rapidamente voc&#234; os consertar&#225;.

Commits frequentes encorajam os desenvolvedores a quebrar seus trabalhos em pequenos peda&#231;os de poucas horas cada. Isso ajuda a dividir o progresso e causa um senso de progresso. Frequentemente as pessoas come&#231;am sentir que n&#227;o conseguem fazer alguma coisa significativa em poucas horas, mas n&#243;s temos encontrado que esta teoria e  pr&#225;tica ajudam os desenvolvedores a aprender.
&lt;h3&gt;Cada commit deve atualizar o reposit&#243;rio principal em uma m&#225;quina de integra&#231;&#227;o&lt;/h3&gt;
Usando commits diariamente, um time tem builds frequentemente testadas. Isso deveria significar que o reposit&#243;rio principal esta em um estado saud&#225;vel. Na pr&#225;tica, entretanto, coisas continuam dando errado. Um raz&#227;o &#233; a disciplina: pessoas n&#227;o est&#227;o atualizando suas vers&#245;es e fazendo uma build antes de fazerem seus commits. Outra &#233; que existem diferen&#231;as de ambiente entre as m&#225;quina dos desenvolvedores. Como uma poss&#237;vel solu&#231;&#227;o voc&#234; deve assegurar que as builds ocorram em uma m&#225;quina de integra&#231;&#227;o e somente se a build de integra&#231;&#227;o passar com sucesso &#233; que o commit deve ser considerado feito. Levando em considera&#231;&#227;o que o desenvolvedor que realiza o commit deve ser respons&#225;vel pelo mesmo, ele precisa monitorar o reposit&#243;rio principal para que possa corrigir qualquer problema que possa ocorrer. A consequ&#234;ncia desta responsabilidade &#233; que ele n&#227;o deve ir para casa at&#233; que a build do reposit&#243;rio principal tenha passado por qualquer commit ele tenha realizado durante o dia.

Existem duas formas principais que eu vejo para assegurarmos que isso ocorra: usando um  processo manual de build ou um servidor de integra&#231;&#227;o cont&#237;nua. Descrever a abordagem da build manual &#233; simples. Essencialmente ela &#233; similar a build local que um desenvolvedor faz antes de lan&#231;ar suas altera&#231;&#245;es no reposit&#243;rio. O desenvolvedor vai para a m&#225;quina de integra&#231;&#227;o, checa a vers&#227;o do reposit&#243;rio principal ( que &#233; o &#250;ltimo commit feito da casa) e faz a build de integra&#231;&#227;o. Ele verifica todo este processo, e se a build  for feita com sucesso ele finaliza seu commit (veja tamb&#233;m &lt;a href="http://www.jamesshore.com/Blog/Continuous-Integration-on-a-Dollar-a-Day.html" target="_blank"&gt;a descri&#231;&#227;o de Jim Shore's&lt;/a&gt;).

Um servidor de integra&#231;&#227;o cont&#237;nua age como um monitor para o reposit&#243;rio. Toda vez que um commit &#233; feito no reposit&#243;rio o servidor automaticamente checa as fontes na m&#225;quina de integra&#231;&#227;o, inicia a build, e notifica para quem fez o commit o resultado da build. Quem fez a build n&#227;o a considera terminada enquanto ele n&#227;o recebe uma notifica&#231;&#227;o - geralmente por e-mail. Na ThoughWorks, n&#243;s somos grandes f&#227;s de servidores de integra&#231;&#227;o cont&#237;nua - na verdade n&#243;s gerenciamos o desenvolvimento original do &lt;a href="http://cruisecontrol.sourceforge.net/" target="_blank"&gt;CruiseControl&lt;/a&gt; e do &lt;a href="http://ccnet.thoughtworks.com/" target="_blank"&gt;CruiseControl.NET&lt;/a&gt;, um servidor open-source de IC largamente usado. Desde ent&#227;o n&#243;s tamb&#233;m constru&#237;mos o servidor de IC comercial chamado Cruise. N&#243;s usamos um servidor de IC quase que com todos os projetos que n&#243;s fazemos, e temos sido muito felizes com os resultados.

Nem todos preferem usar um servidor de IC. Jim Shore deu uma &lt;a href="http://www.jamesshore.com/Blog/Continuous-Integration-is-an-Attitude.html" target="_blank"&gt;boa descri&#231;&#227;o&lt;/a&gt; do porqu&#234; ele prefere uma abordagem manual. Eu concordo com ele que IC &#233; muito mais que somente  a instala&#231;&#227;o de qualquer software. Todas as pr&#225;ticas citadas aqui s&#227;o feitas efetivamente na IC. Mas igualmente muitos times que fazem IC achar&#227;o bom um servidor de IC para ser uma ferramenta &#250;til.Muitas organiza&#231;&#245;es fazem builds regulares em um tempo marcado, tipo toda noite. Isso n&#227;o &#233; a mesma coisa como uma build cont&#237;nua e n&#227;o &#233; o suficiente para a IC. O ponto principal da IC &#233; ajudar a encontrar os problemas o mais r&#225;pido poss&#237;vel. Builds noturnas significam que os erros ficam desapercebidos durante um dia inteiro antes que qualquer um os descubram. Uma vez que eles ficam muito tempo no sistema, eles demoram um longo tempo para serem encontrados e removidos.

O ponto chave de se ficar fazendo a build de integra&#231;&#227;o &#233; que se a build do reposit&#243;rio principal falhar, ela ser&#225; corrigida no jeito certo. A id&#233;ia central de se estar trabalhando com a IC &#233; que voc&#234; sempre desenvolve em uma base conhecida e est&#225;vel. N&#227;o &#233; uma coisa ruim a build do reposit&#243;rio principal falhar, embora se isso acontecer o tempo todo &#233; sinal que as pessoas n&#227;o est&#227;o sendo cuidadosas o suficiente em atualizar e realizar a build localmente antes de realizarem o commit. Quando a build do reposit&#243;rio principal quebrar, entretanto, &#233; importante que seja corrigida rapidamente. Para ajudar a evitar o quebramento do reposit&#243;rio principal, voc&#234; pode considerar usar uma &lt;a href="http://martinfowler.com/bliki/PendingHead.html" target="_blank"&gt;pending head&lt;/a&gt;.

Quanto as equipes que s&#227;o iniciantes na IC, frequentemente esta &#233; uma das coisas mais dif&#237;ceis  para se resolver. Uma equipe deve lutar para o quanto antes conseguir ter o h&#225;bito de trabalhar em builds da vers&#227;o principal, particularmente se ela estiver trabalhando sobre uma base existente de c&#243;digo. Paci&#234;ncia e const&#226;ncia geralmente s&#227;o boas dicas, portanto n&#227;o desista.
&lt;h3&gt;Mantenha a Build r&#225;pida&lt;/h3&gt;
O foco da IC &#233; prover um feedback r&#225;pido. Nada &#233; mais prejudicial as atividades da IC que uma build que toma muito tempo. Neste ponto eu tenho que admitir que existia um pouco de velho cara que considerava que uma build tinha que ser longa. A maior parte dos meus colegas consideram que uma build de uma hora &#233; totalmente sem sentido. Eu me lembro de equipes sonhando que poderiam fazer isso tudo muito r&#225;pido e que ocasionalmente eles continuam rodando certos casos onde &#233; muito dif&#237;cil ter builds nesta velocidade.

Para a maior parte dos projetos, entretanto, a linha de build do XP de 10 minutos &#233;, com raz&#227;o, perfeita. A maioria dos nossos projetos modernos conseguem atingir isso.  Isto &#233; digno de se concentrar esfor&#231;os para fazer com que aconte&#231;a, porque a cada minuto que voc&#234; reduz o tempo da build &#233; um minuto salvo para cada desenvolvedor a cada momento que ele realiza um commit. Uma vez que a IC demanda commits frequentes, ela economiza muito tempo.

Se voc&#234; estiver come&#231;ando com uma build de uma hora,  come&#231;ar a fazer a build cada vez mais r&#225;pido pode parecer intimidante. Isso pode at&#233; mesmo ser assustador come&#231;ar a trabalhar em um projeto novo  e pensar em manter as coisas r&#225;pidas. Para aplica&#231;&#245;es empresariais, ao menos, nos temos visto que o principal gargalo &#233; testar - particularmente testes que envolvam servi&#231;os externos como uma base de dados.

Provavelmente o ponto mais importante &#233; come&#231;ar trabalhando na configura&#231;&#227;o de uma staged build (ou build por est&#225;gios, ou tamb&#233;m build encadeada).  A id&#233;ia por tr&#225;s de uma staged build &#233; que existe de fato multiplos builds feitas em sequ&#234;ncia. O commit no reposit&#243;rio principal aciona a primeira build, que eu chamo de commit build. A commit build &#233; a build que necessitou ser executada quando algu&#233;m atualizou o reposit&#243;rio principal. A commit build &#233; a que tem que ser feita rapidamente, como consequ&#234;ncia esta tomar&#225; alguns atalhos que diminuir&#227;o a capacidade de se achar bugs. O truque &#233; balancear a necessidade de procurar bugs e a velocidade para que haja uma commit build est&#225;vel o suficiente para que outras pessoas possam trabalhar.

Uma vez que a commit build &#233; boa, ent&#227;o outras pessoas podem trabalhar no c&#243;digo com confian&#231;a. Entretanto existem testes novos e lentos que voc&#234; pode come&#231;ar a fazer. M&#225;quinas adicionais podem  rodar novas rotinas de testes na build que precisa de mais tempo.

Um exemplo simples disto &#233; uma build de dois est&#225;gios. O primeiro est&#225;gio deve realizar a compila&#231;&#227;o e rodar os testes que s&#227;o mais focados nos testes unit&#225;rios com a base de dados vazia. Tais testes podem rodar muito r&#225;pido, dentro da linha de 10 minutos. Entretanto qualquer problema que envolva uma escala maior de intera&#231;&#245;es, particularmente aqueles envolvendo a base de dados real, n&#227;o ser&#227;o encontrados. O segundo est&#225;gio roda em uma suite diferente de testes que acessam a base de dados real e envolve um comportamento de ponta-a-ponta. Essa suite pode tomar algumas horas para rodar.

Neste cen&#225;rio as pessoas usam o primeiro est&#225;gio com a commit build  e a usam para os seus ciclos principais da IC. O segundo est&#225;gio &#233; formado por uma build secund&#225;ria que roda quando poss&#237;vel, pegando os execut&#225;veis da ultima build v&#225;lida para novos testes. Se a build secund&#225;ria falhar, ent&#227;o isto n&#227;o ter&#225; o mesmo "pare tudo", mas o time precisa ter o objetivo de corrigir os problemas t&#227;o r&#225;pido quando poss&#237;vel, enquanto mantem funcionando a build de commit. Na verdade a build secund&#225;ria n&#227;o tem que ser sempre boa, t&#227;o logo os problemas sejam identificados e tratados em poucos dias. Como neste exemplo, as builds secund&#225;rias s&#227;o frequentemente testes puros, desde que estes testes causem lentid&#227;o.

Se a build secund&#225;ria detectar um problema, isso &#233; um sinal que a commit build poderia fazer outro teste. Assegure-se o tanto quanto poss&#237;vel que qualquer falha na build secund&#225;ria te leve a novos testes na commit build onde voc&#234; deve pegar o problema, para que os problemas fiquem corrigidos na commit build. Desta forma os testes de commit s&#227;o refor&#231;ados sempre que alguma coisa passar por eles. Existem casos onde n&#227;o existem como construir um teste que rode r&#225;pido e que exponha o erro, ent&#227;o voc&#234; pode decidir somente testar aquela condi&#231;&#227;o na build secund&#225;ria. Felizmente, na maior parte do tempo, voc&#234; pode adicionar testes apropriados para a commit build.

Este exemplo &#233; de uma build de dois est&#225;gios, mas o principio b&#225;sico pode ser extendido para qualquer n&#250;mero de builds posteriores a principal. As builds posteriores a commit build pode tamb&#233;m serem feitas em paralelo, ent&#227;o se voc&#234; tem duas horas de testes secund&#225;rios voc&#234; pode melhorar o tempo e resposta do processo tendo duas m&#225;quinas que rodam metade dos testes cada. Usando builds secund&#225;rias paralelas desta forma voc&#234; pode introduzir todos tipo de novos testes autom&#225;ticos, incluindo teste de performance, dentro do processo regular de build (eu tenho rodado muitas t&#233;cnicas interessantes como essa assim que visitei muitos projetos da ThoughtWorks nos &#250;ltimos anos - e estou esperan&#231;oso para incentivar alguns dos desenvolvedores a escreve-las).
&lt;h3&gt;Teste em uma c&#243;pia do ambiente de produ&#231;&#227;o&lt;/h3&gt;
O ponto central dos testes &#233; trazer a tona, dentro de condi&#231;&#245;es controladas, qualquer problema que o sistema vai ter em produ&#231;&#227;o. Um parte significante disto &#233; que o ambiente onde eles ir&#227;o rodar deve ser como o de produ&#231;&#227;o. Se voc&#234; testar em um ambiente diferente, toda diferen&#231;a resultar&#225; no risco das situa&#231;&#245;es sob teste n&#227;o  acontecerem em produ&#231;&#227;o.

Uma solu&#231;&#227;o para isso &#233; que voc&#234; configure seu ambiente de teste, dentro poss&#237;vel, para ser uma c&#243;pia exata do seu ambiente de produ&#231;&#227;o. Use o mesmo software de banco de dados, com as mesmas vers&#245;es, use a mesma vers&#227;o do sistema operacional. Bote todas as bibliotecas que est&#227;o no ambiente de produ&#231;&#227;o para o ambiente de teste, mesmo que o sistema atualmente n&#227;o as use. Use o mesmo endere&#231;o IP e portas, rodando no mesmo hardware.

Bom, na verdade existem limites. Se voc&#234; esta escrevendo um software desktop n&#227;o &#233; pr&#225;tico testar em uma c&#243;pia em todos os desktops poss&#237;veis com todas as partes terceirizadas do software que as diferentes pessoas est&#227;o rodando. Da mesma forma, alguns ambientes de produ&#231;&#227;o podem ser caras demais para serem duplicadas (embora eu tenho encontrado frequentemente falsas economias n&#227;o duplicando ambientes nem t&#227;o caros assim). Apesar destes limites, seu objetivo deve continuar sendo  duplicar o ambiente de produ&#231;&#227;o tanto quanto poss&#237;vel e entender que os riscos que voc&#234; estar&#225; aceitando por cada diferen&#231;a entre os ambientes de teste e produ&#231;&#227;o.

Se voc&#234; tem uma configura&#231;&#227;o boa e simples,  sem ter que fazer muitas comunica&#231;&#245;es incomodas, voc&#234; pode rodar sua commit build em um ambiente copiado. Frequentemente, entretanto, voc&#234; necessitar&#225; fazer &lt;a href="http://www.martinfowler.com/bliki/TestDouble.html" target="_blank"&gt;testes duplos&lt;/a&gt;, porque os sistemas responder&#227;o lenta ou intermitentemente. Como um resultado, &#233; comum ter um ambiente muito artificial para os tests de commit, e usar uma c&#243;pia da produ&#231;&#227;o para os testes secund&#225;rios.

Eu tive not&#237;cias em um crescente interesse em usar virtualiza&#231;&#227;o para tornar f&#225;cil juntar ambientes de testes. M&#225;quinas virtuais podem ser salvas com todos os elementos necess&#225;rios juntos na virtualiza&#231;&#227;o. &#201; relativamente simples instalar a &#250;ltima build e rodar os testes. Al&#233;m disso, isto permite a voc&#234; rodar multiplos testes em uma m&#225;quina, ou simular v&#225;rias m&#225;quinas em uma rede com uma &#250;nica m&#225;quina. Como o &#244;nus da performance tem diminuido, esta op&#231;&#227;o faz cada vez mais sentido.
&lt;h3&gt;Torne f&#225;cil para qualquer um ter o &#250;ltimo execut&#225;vel.&lt;/h3&gt;
Uma das partes mais dif&#237;ceis de desenvolvimento de software &#233; ter certeza de que voc&#234; esta construindo o software certo. N&#243;s temos visto que &#233; muito dif&#237;cil especificar adiantadamente o que voc&#234; quer  e estar correto. Pessoas acham mais f&#225;cil ver algo que n&#227;o &#233; bom o bastante e dizer como isto precisa ser alterado. Os processos de desenvolvimento &#225;geis incentiva explicitamente e tomam vantagem desta parte do comportamento humano.

Para ajudar a fazer este trabalho, qualquer um envolvido com um projeto de software deve ser h&#225;bil para ter a &#250;ltima vers&#227;o execut&#225;vel e ser capaz de roda-la: para demonstra&#231;&#245;es, testes explorat&#243;rios ou simplesmente ver o que mudou esta semana.

Fa&#231;a isto ser bem simples: tenha certeza que existe um bom lugar conhecido onde as pessoas possam pegar o &#250;ltimo execut&#225;vel. Pode ser &#250;til p&#244;r muitos execut&#225;veis em um lugar comum. Para a vers&#227;o mais recente voc&#234; deve por o &#250;ltimo execut&#225;vel que passou nos testes de commit - como um execut&#225;vel, ele deve ser est&#225;vel.

Se voc&#234; estiver seguindo um processo com itera&#231;&#245;es bem definidas, geralmente &#233; s&#225;bio por tamb&#233;m junto o resultado final das builds da itera&#231;&#227;o. Demostra&#231;&#245;es, em particular, precisam do software cuja as caracter&#237;sticas s&#227;o familiares, ent&#227;o geralmente vale a pena por a &#250;ltima vers&#227;o para alguma coisa necess&#225;ria para quem estiver mostrando o software
&lt;h3&gt;Todos pode ver o que esta acontecendo.&lt;/h3&gt;
Tudo sobre Integra&#231;&#227;o Cont&#237;nua esta relacionado a comunica&#231;&#227;o, ent&#227;o voc&#234; precisa ter certeza que todos possam facilmente ver o estado do sistema e as mudan&#231;as que tem sido feitas nele.

Uma das coisas mais importantes para se comunicar &#233; o estado da build da vers&#227;o principal. Se voc&#234; estiver usando o Cruise existe uma ferramenta embutida no site dele que ir&#225; mostrar a voc&#234; se existe uma build em progresso e o qual foi o estado da &#250;ltima build da vers&#227;o principal. Muitos times gostam de fazer esta informa&#231;&#227;o chamar mais a aten&#231;&#227;o colocando um display mostrando o sistema de build - com as populares luzes verde (quando a build funciona) e vermelha (quando ela falha). Um jeito particular &#233; por algo como as &lt;a href="http://www.pragmaticautomation.com/cgi-bin/pragauto.cgi/Monitor/Devices/BubbleBubbleBuildsInTrouble.rdoc" target="_blank"&gt;lampadas de lava &lt;/a&gt;verde e vermelha - n&#227;o somente para indicar o estado da build mas tamb&#233;m para indicar por quanto tempo tem permanecido cada estado. Bolhas em uma l&#226;mpada vermelha indica que a build tem quebrado por muito tempo. Cada time faz suas pr&#243;prias escolhas sobre esses sensores da build - &#233; bom ser informal com sua escolha (recentemente eu vi algu&#233;m experimentando por um coelho dan&#231;ando).

Se voc&#234; estiver usando um processo de IC manual, a visibilidade deste continua sendo essencial. O monitor da m&#225;quina de build pode mostrar o status da build da vers&#227;o principal. Frequentemente voc&#234; tem algo para ser posto na mesa de qualquer um que esteja fazendo atualmente a build (novamente alguma coisa boba como uma galinha de borracha &#233; uma boa op&#231;&#227;o). Geralmente as pessoas gostam de fazer um som simples avisando boas builds, como um som de um sino.

As p&#225;ginas dos servidores de IC pode trazer mais informa&#231;&#245;es que estas, claro. Cruise oferece um indicador n&#227;o somente de quem esta fazendo a build, mas quais mudan&#231;as ele fez. Cruise tamb&#233;m prov&#234; um hist&#243;rico de mudan&#231;as, permitindo membros da equipe ter uma boa informa&#231;&#227;o das recentes atividades no projeto. Eu conhe&#231;o equipes que gostam de usar isto para ter um senso do que as pessoas tem feito e manter uma id&#233;ia das mudan&#231;as feitas no sistema.

Outra vantagem de usar um site &#233; para aqueles que n&#227;o est&#227;o pr&#243;ximos fisicamente poderem ter uma id&#233;ia do status do projeto. Normalmente eu prefiro ter todos que est&#227;o trabalhando ativamente no projeto juntos, mas geralmente existem pessoas longes onde seja bom que tenham id&#233;ia de como as coisas est&#227;o. O site tamb&#233;m &#233; &#250;til para as equipes para manter junto informa&#231;&#245;es de builds de v&#225;rios projetos - gerando um status simples e autom&#225;tico dos diferentes projetos.

Um bom painel de informa&#231;&#245;es n&#227;o s&#227;o  somente aqueles em uma tela de computador. Um dos meus pain&#233;is favoritos foi de um projeto que estava come&#231;ando na IC. Ele tinha uma hist&#243;ria longa de problemas em fazer builds est&#225;veis. N&#243;s colocamos um calend&#225;rio na parede que mostrava um ano inteiro com um pequeno quadrado para cada dia. Todo dia o grupo de controle  de qualidade (QA) colocaria um adesivo verde quando recebia uma build est&#225;vel que passou nos testes, ou, colocaria um adesivo vermelho. Com o passar do tempo o calend&#225;rio revelou que o estado do processo de build mostrava um crescimento est&#225;vel at&#233; que os quadrados verdes eram t&#227;o comuns que o calend&#225;rio desapareceu - com seu prop&#243;sito cumprido.
&lt;h3&gt;Automatize a Implanta&#231;&#227;o do Sistema&lt;/h3&gt;
Para fazer a Integra&#231;&#227;o Cont&#237;nua voc&#234; precisar&#225; de multiplos ambientes, um para rodar os testes de commit (ou commit build), um ou mais para rodar os testes secund&#225;rios. Uma vez que voc&#234; esteja movendo os execut&#225;veis entre estes ambientes v&#225;rias vezes por dia, voc&#234; vai querer fazer isso automaticamente. Ent&#227;o &#233; importante ter scripts que permitam voc&#234; implantar a aplica&#231;&#227;o dentro de qualquer ambiente facilmente. Uma consequ&#234;ncia natural disto &#233; que voc&#234; deve ter scripts que permitam voc&#234; implantar o software dentro do ambiente de produ&#231;&#227;o t&#227;o facilmente quanto nos outros ambientes.  Voc&#234; pode n&#227;o implantar o software no ambiente de produ&#231;&#227;o todos os dias (embora em tenho rodado projetos em que isso aconte&#231;a), mas implanta&#231;&#245;es autom&#225;ticas ajudam tanto a tornar o processo mais r&#225;pido quanto a reduzir erros. E isto &#233; tamb&#233;m uma op&#231;&#227;o barata desde que voc&#234; use somente as mesmas configura&#231;&#245;es que voc&#234; usa nos deploys dos ambientes de teste .

Se voc&#234; implantar alguma fun&#231;&#227;o extra no ambiente de produ&#231;&#227;o voc&#234; deve checar se isto ter&#225; um rollback (ou reverter) autom&#225;tico. Coisas ruins podem acontecer de tempos em tempos, e se algo n&#227;o der certo &#233; bom ser capaz de desfazer rapidamente tudo para a &#250;ltima vers&#227;o boa conhecida. Ser capaz de reverter automaticamente tamb&#233;m reduz muita tens&#227;o durante a implanta&#231;&#227;o, encorajando as pessoas a realizarem deploy ( entrega e implanta&#231;&#227;o de uma vers&#227;o) com mais frequ&#234;ncia e assim ter novas funcionalidades para entregarem para os usu&#225;rios rapidamente. ( A comunidade Ruby on Rails desenvolveu uma ferramenta chamada &lt;a href="http://capify.org/" target="_blank"&gt;Capistrano&lt;/a&gt; que &#233; um bom exemplo de uma ferramenta que faz esse tipo de coisa).

Em ambientes em cluster n&#243;s temos visto processos de implanta&#231;&#227;o acontecerem onde um novo software &#233; implantando em um n&#243; por vez, substituindo gradualmente a aplica&#231;&#227;o durante o curso de poucas horas. Veja o artigo relacionado &lt;a href="http://www.martinfowler.com/articles/evodb.html" target="_blank"&gt;Evolutionary Database Design&lt;/a&gt;.

Um empecilho para muitas pessoas que fazem releases frequentes &#233; a migra&#231;&#227;o de banco de dados. Mudan&#231;as na base de dados s&#227;o dolorosas porque voc&#234; n&#227;o pode simplesmente mudar os schemas do banco de dados, voc&#234; tem tamb&#233;m que assegurar que os dados migraram corretamente. Este artigo descreve t&#233;cnicas usadas por meu colega Pramod Sadalage para fazer a refatora&#231;&#227;o autom&#225;tica e a migra&#231;&#227;o dos bancos de dados. O artigo &#233; uma tentativa r&#225;pida de captar a informa&#231;&#227;o descrita em maiores detalhes pelo livro do Pramod e Scott Amblers sobre refatora&#231;&#227;o de banco de dados.

Uma varia&#231;&#227;o particular e interessante  disto que eu tenho visto surgir com a aplica&#231;&#227;o web p&#250;blica &#233; a id&#233;ia de implantar uma vers&#227;o limitada para um grupo menor de usu&#225;rios. O time ent&#227;o v&#234; como essa vers&#227;o limitada &#233; usada antes de decidir se implantada o sistema para todos os usu&#225;rios. Isto permite voc&#234; testar novas funcionalidades de interfaces com o usu&#225;rio antes de prosseguir para uma vers&#227;o final.  Implanta&#231;&#227;o automatizada aliada a uma boa disciplina de IC  &#233; essencial para fazer isso funcionar.
&lt;h2&gt;Benef&#237;cios da Integra&#231;&#227;o Cont&#237;nua&lt;/h2&gt;
Olhando isso tudo eu penso que o maior e mais abrangente benef&#237;cio da Integra&#231;&#227;o Cont&#237;nua &#233; a redu&#231;&#227;o de riscos. Minha mente continua flutuando de volta para aquele projeto de software anterior que eu mencionei no meu primeiro paragrafo. La as pessoas estavam no final (ao menos acreditavam) de um longo projeto, sem ainda uma id&#233;ia real de qu&#227;o longo isto deveria ser antes de terem terminado.

O problema com aquela forma de integra&#231;&#227;o narrada &#233; que &#233; muito dif&#237;cil saber o qu&#227;o longa ela ser&#225;, e o pior &#233; que &#233; muito dif&#237;cil saber o qu&#227;o longe voc&#234; ter&#225; que ir neste processo. O resultado &#233; que voc&#234; esta pondo completamente a si mesmo em um ponto cego justamente em uma das partes mais tensas do projeto - mesmo que voc&#234; esteja em um dos raros casos de ainda n&#227;o estar atrasado. Integra&#231;&#227;o Cont&#237;nua reduz completamente este problema. N&#227;o existe uma integra&#231;&#227;o longa, voc&#234; elimina completamente o ponto cego. Em todo tempo voc&#234; sabe onde voc&#234; esta, o que funciona, o que n&#227;o funciona e os bugs pendentes que voc&#234; tem em seu sistema.

Bugs - estes s&#227;o as coisas s&#243;rdidas que destroem a confian&#231;a, bagun&#231;am os cronogramas e as reputa&#231;&#245;es. Bugs no software implantando fazem os usu&#225;rios ficarem com raiva de voc&#234;. Bugs no trabalho em progresso entram em seu caminho, tornando dif&#237;cil ter o resto do software funcionando corretamente.

Integra&#231;&#227;o Cont&#237;nua n&#227;o nos livra dos bugs, mas os tornam dramaticamente mais f&#225;ceis de encontrar e remover. O grande respons&#225;vel por este aspecto &#233; o c&#243;digo auto-test&#225;vel. Se voc&#234; introduzir um problema e detecta-lo rapidamente, &#233; mais f&#225;cil remover os problemas. Desde que voc&#234; modificou somente uma parte pequena do sistema, voc&#234; n&#227;o tem que olhar muita coisa. Desde que aquele peda&#231;o do sistema &#233; o peda&#231;o com que voc&#234; trabalhou, ele ainda esta fresco em sua mem&#243;ria, novamente tornando f&#225;cil de encontrar o problema. Voc&#234; tamb&#233;m pode usar um &lt;a href="http://www.martinfowler.com/bliki/DiffDebugging.html" target="_blank"&gt;diff debugging&lt;/a&gt; (ou um avaliador de diferen&#231;as) - comparando a vers&#227;o corrente do sistema com uma vers&#227;o anterior que n&#227;o tinha o bug.

O bugs tamb&#233;m s&#227;o cumulativos. Quanto mais bugs voc&#234; tiver, mais dif&#237;ceis s&#227;o se serem removidos. Em parte isto acontece porque voc&#234; tem intera&#231;&#245;es entre os bugs, onde as falhas s&#227;o apresentadas como o resultado de m&#250;ltiplos erros - tornando cada erro cada vez mais dif&#237;cil de ser encontrado. E isto tamb&#233;m &#233; psicol&#243;gico - pessoas tem menos energia para encontrar e eliminar os bugs quando existem v&#225;rios deles - um fen&#244;meno que os programadores pragmaticos chamam de s&#237;ndrome da &lt;a href="http://www.amazon.com/exec/obidos/ASIN/020161622X" target="_blank"&gt;Janela Quebrada&lt;/a&gt;.

Para uma resposta a isso, projetos com IC tendem a ter dramaticamente menos bugs, tanto em produ&#231;&#227;o quanto em desenvolvimento. Entretanto eu devo ressaltar que o grau deste benef&#237;cio esta diretamente amarrado a qu&#227;o boa sua suite de testes &#233;. Voc&#234; deve entender que n&#227;o t&#227;o dif&#237;cil construir uma suite de teste que fa&#231;a uma diferen&#231;a not&#225;vel. Geralmente, entretanto, leva um tempo antes que o time consiga chegar ao mesmo n&#237;vel dos bugs que eles tem que procurar. Avan&#231;ar este n&#237;vel envolve trabalhar constantemente e melhorar seus testes.

Se voc&#234; trabalha com IC, este remove uma das maiores barreiras na implanta&#231;&#227;o frequente. As frequentes implata&#231;&#245;es s&#227;o valorosas porque elas permitem seus usu&#225;rios terem as novas funcionalidades mais rapidamente, para darem feedback mais rapidamente sobre estas funcionalidades e geralmente se tornarem mais colaborativos no ciclo de desenvolvimento. Isto ajuda a quebrar as barreiras entre os desenvolvedores e os clientes - barreiras que eu acredito serem as maiores barreiras para desenvolvimento de software com sucesso.
&lt;h3&gt;Introduzindo a Integra&#231;&#227;o Cont&#237;nua&lt;/h3&gt;
Ent&#227;o voc&#234; imagina tentar a Integra&#231;&#227;o Cont&#237;nua - por onde voc&#234; come&#231;a? Eu mostrei acima todo o conjunto de pr&#225;ticas para te mostrar todos os benef&#237;cios - mas voc&#234; n&#227;o precisa come&#231;ar com tudo isso.

N&#227;o existe uma aqui receita fixa - muita coisa depende da natureza do seu ambiente e do seu time. Mas aqui est&#227;o algumas coisas que n&#243;s temos aprendido pra ter as coisas funcionando.  Um dos primeiros passos &#233; ter uma build automatizada. Ter todo que voc&#234; precisa dentro do seu controle de c&#243;digo para que voc&#234; possa ent&#227;o ter todo o sistema com um &#250;nico comando. Para muitos projetos isto n&#227;o &#233; uma coisa pequena - isso &#233; na verdade essencial para qualquer uma das outras coisas funcionarem. Inicialmente voc&#234; pode fazer a build sob demanda, ou simplesmente fazer uma build noturna automatizada. Enquanto ainda n&#227;o tem um Integra&#231;&#227;o Cont&#237;nua, ter uma build noturna automatizada &#233; um bom passo.

Introduza alguns testes automatizados na sua build.  Tente identificar as &#225;reas onde geralmente as coisas d&#227;o erradas e fa&#231;a testes autom&#225;ticos que exponham estas falhas. Particularmente, em um projeto existente &#233; dif&#237;cil ter realmente uma boa suite de testes funcionando rapidamente - leva tempo para construir os testes. Voc&#234; deve come&#231;ar com o pensamento em algum lugar especifico.

Tente agilizar a commit build. Integra&#231;&#227;o Cont&#237;nua com uma build de poucas horas &#233; melhor do que nada, mas diminuir para o n&#250;mero m&#225;gico de 10 minutos &#233; bem melhor. Isto geralmente requer algumas cirurgias s&#233;rias em sua base de c&#243;digo, como quebrar as depend&#234;ncias das partes lentas do sistema.

Se voc&#234; estiver come&#231;ando em um projeto novo, comece com a Integra&#231;&#227;o Cont&#237;nua desde o in&#237;cio. Mantenha os olhos nos tempos da build e tome alguma a&#231;&#227;o logo quando quando come&#231;ar a ficar mais lento que a regra dos 10 minutos. Agindo rapidamente voc&#234; ir&#225; fazer as reestrutura&#231;&#245;es necess&#225;rias antes que a base de c&#243;digo fique t&#227;o grande que isso se transforme em um problema maior.

Acima de tudo tenha alguma ajuda. Encontre algu&#233;m que tenha feito integra&#231;&#227;o cont&#237;nua antes que possa ajudar voc&#234;. Como qualquer t&#233;cnica nova, &#233; dif&#237;cil introduzi-la quando voc&#234; n&#227;o sabe como o resultado final deve parecer. Pode custar algum dinheiro ter um mentor, mas voc&#234; pode tamb&#233;m pagar por tempo e produtividade perdidos se voc&#234; n&#227;o sabe fazer isso. ( Aviso: sim, n&#243;s da ThoughtWorks fazemos algumas consultorias nesta &#225;rea. Afinal de contas n&#243;s cometemos a maior parte dos erros que podem ser feitos).
&lt;h3&gt;Pensamentos Finais&lt;/h3&gt;
Desde que Matt e eu escrevemos a vers&#227;o original desde artigo, a Integra&#231;&#227;o Cont&#237;nua tem se tornado a principal t&#233;cnica para o desenvolvimento de software. Dificilmente qualquer projeto da ThoughWorks acontece sem isso  - e n&#243;s temos visto outros usando IC ao redor do mundo.  Dificilmente eu ou&#231;o coisas negativas sobre esta abordagem - ao contr&#225;rio de algumas das mais controversas pr&#225;ticas do Extreme Programming.

Se voc&#234; n&#227;o estiver usando Integra&#231;&#227;o Cont&#237;nua eu recomento fortemente voc&#234; a tentar. Se voc&#234; voc&#234; estiver usando, talvez algumas id&#233;ias pode ajudar a voc&#234; fazer isso mais efetivamente. N&#243;s temos aprendido muito sobre Integra&#231;&#227;o Cont&#237;nua nos &#250;ltimos anos,  e eu espero que possamos continuar aprendendo e melhorando isso ainda mais.
&lt;h3&gt;Leitura Indicada&lt;/h3&gt;
Um ensaio como este pode somente cobrir por alto algumas coisas. Para explorar a Integra&#231;&#227;o Cont&#237;nua em maiores detalhes, eu sugiro dar uma olhada no &lt;a href="http://martinfowler.com/books.html#duvall" target="_blank"&gt;livro do Paul Duvall &lt;/a&gt;sobre este tema (que ganhou um pr&#234;mio Jolt - mais do que eu j&#225; tenha alcan&#231;ado). N&#227;o existem muitas coisas sendo escritas sobre builds por est&#225;gios mas existe um ensaio escrito por Dave Farley na &lt;a href="http://www.pragprog.com/titles/twa/thoughtworks-anthology" target="_blank"&gt;The ThoughtWorks Anthology&lt;/a&gt; que &#233; &#250;til (tamb&#233;m dispon&#237;vel &lt;a href="http://studios.thoughtworks.com/assets/2007/5/11/The-Deployment-Pipeline-by-Dave-Farley-2007.pdf" target="_blank"&gt;aqui&lt;/a&gt;).</description>
      <guid>/</guid>
    </item>
    <item>
      <title>Voc&#234; j&#225; ouviu falar em CouchDB ?</title>
      <link>http://www.blogdopedro.net/2009/01/16/voce-ja-ouviu-falar-em-couchdb</link>
      <description>&lt;img style="float:left;cursor:hand;width:170px;height:151px;margin:0 10px 10px 0;" src="http://4.bp.blogspot.com/_gMGOvKSyf40/SXCNb_p2q6I/AAAAAAAAAMg/L0Tn35Jz240/s400/Couchdb-logo.png" border="0" /&gt;Esta semana fui apresentado a id&#233;ia de usar o &lt;a href="http://en.wikipedia.org/wiki/CouchDB"&gt;Apache CouchDB&lt;/a&gt; pelo &lt;a href="http://www.dx7lab.com/"&gt;dx7lab&lt;/a&gt; em um projeto experimental. J&#225; tinha visto algumas pessoas falarem dele, mas confesso que o m&#225;ximo que conhecia era a descri&#231;&#227;o do wikipedia. Existe pouco material na net sobre ele, at&#233; porque o projeto &#233; bem recente, mas a id&#233;ia principal &#233; bem inovadora: unir a id&#233;ia de um db distribu&#237;do, orientado a documentos, usando JSON como base pra sua organiza&#231;&#227;o e toda camada para seu acesso baseada em REST. Uau!

Ainda estamos lendo muito [muito mesmo] sobre o assunto e aprendendo muitas coisas legais. Se voc&#234; quiser dar uma lida, al&#233;m do &lt;a href="http://couchdb.apache.org/"&gt;site oficial&lt;/a&gt; existem alguns recursos legais:

&lt;h3&gt;Livro da O'Reilly&lt;/h3&gt;&lt;br /&gt;A O'Reilly Media esta publicando o rascunho do seu livro sobre CouchDB (com o humilde adendo ao  titulo de "Definitive Guide"). Ainda tem muita coisa a ser escrita, mas aos poucos os conte&#250;dos v&#227;o sendo postos online. O link? Esse &lt;a href="http://books.couchdb.org/relax/"&gt;aqui&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Screencast do peepcode sobre Rails+CouchDB&lt;/h3&gt;&lt;br /&gt;O peepcode publicou h&#225; algum tempo um screencast sobre como usar uma app &lt;a href="http://peepcode.com/products/couchdb-with-rails"&gt;Rails com CouchBD&lt;/a&gt;. O valor do screencast &#233; de U$ 9, se voc&#234; tiver paypal, fica a dica.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Tradu&#231;&#227;o do Madrug&#227;o sobre o CouchDB on Rails by Aimee&lt;/h3&gt;&lt;br /&gt;O pessoal do &lt;a href="http://www.madrugaonrails.com.br"&gt;madrugao&lt;/a&gt; esta traduzindo e postando um material muito legal sobre o tema. Vale dar uma olhada. O link &#233; &lt;a href="http://www.madrugaonrails.com.br/2008/12/23/traduuao-couchdb-on-rails-by-aimee"&gt;esse&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Enfim, acho que o recado esta dado. Ainda n&#227;o sei se o CouchDB se comporta bem em produ&#231;&#227;o, por isso cuidado, todo passo dado agora &#233; um investimento alto. Mas por tudo que o projeto pretende ser, quando estiver 100% vai ser muito, muito legal.</description>
      <guid>/</guid>
    </item>
    <item>
      <title>Factory Pattern e PHP</title>
      <link>http://www.blogdopedro.net/2009/01/09/factory-pattern-e-php</link>
      <description>Voltando a visitar alguns bookmarks de blogs sobre PHP, encontrei um material simples mas interessante do &lt;a href="http://www.deshong.net/about-2/"&gt;Brian DeShong&lt;/a&gt;. Ele publicou no seu site o slide de sua palestra sobre o padr&#227;o Factory e sua implementa&#231;&#227;o em PHP. O link &#233; esse &lt;a href="http://www.deshong.net/?p=169"&gt;aqui&lt;/a&gt;.</description>
      <guid>/</guid>
    </item>
    <item>
      <title>Dica de leitura</title>
      <link>http://www.blogdopedro.net/2008/12/29/dica-de-leitura</link>
      <description>&lt;a href="http://www.livrariacultura.com.br/scripts/cultura/externo/index.asp?id_link=5378&amp;amp;tipo=2&amp;amp;isbn=8575220470"&gt;&lt;img style="float:left;width:130px;height:181px;margin:0 10px 10px 0;" src="http://3.bp.blogspot.com/_gMGOvKSyf40/SVj4PGuArdI/AAAAAAAAAMQ/jKSzQOtml3Q/s400/extreme-programming.jpg" border="0" /&gt;&lt;/a&gt;Aproveitando as f&#233;rias da faculdade prometi pra mim mesmo que vou botar em dia algumas metas de leitura e o primeiro foi o livro do &lt;a href="http://www.improveit.com.br/empresa/vinicius"&gt;Vinicius Teles da Improve It&lt;/a&gt;, cujo tema e titulo s&#227;o os mesmos: &lt;a href="http://www.livrariacultura.com.br/scripts/cultura/externo/index.asp?id_link=5378&amp;amp;tipo=2&amp;amp;isbn=8575220470"&gt;Extreme Programming&lt;/a&gt;. &lt;br /&gt;&lt;br /&gt;O livro da uma pincelada em muita coisa que tem se dito sobre desenvolvimento &#225;gil de uma maneira descontra&#237;da e sem muita enrola&#231;&#227;o. Muito exemplos, experi&#234;ncias pessoais do autor e boas refer&#234;ncias liter&#225;rias. O &#250;nico ponto negativo &#233; que as vezes ele se torna um pouco repetitivo, mas isso n&#227;o chega a ser um motivo que fa&#231;a algu&#233;m parar de l&#234;-lo.&lt;br /&gt;&lt;br /&gt;Aproveitando o jab&#225;, no site da Livraria Cultura d&#225; pra ler o primeiro cap&#237;tulo. Fica a dica ao interessados pelo livro/tema.</description>
      <guid>/</guid>
    </item>
    <item>
      <title>Programming Ruby</title>
      <link>http://www.blogdopedro.net/2008/12/17/programming-ruby</link>
      <description>&lt;img style="float:left;width:208px;margin:0 10px 10px 0;" src="http://1.bp.blogspot.com/_gMGOvKSyf40/SUlRmcPIvzI/AAAAAAAAAMI/sX60jpx5sfY/s400/cover.jpg" border="0" /&gt;Pra qualquer mortal que inicia em Ruby on Rails, ter uma base de Ruby &#233; fundamental. Al&#233;m do pr&#243;prio &lt;a href="http://www.rubyist.net/~slagell/ruby/"&gt;user guide&lt;/a&gt;, o &lt;a href="http://dx7lab.com"&gt;dx7labs&lt;/a&gt; colocou no seu site pessoal uma c&#243;pia do livro &lt;a href="http://dx7lab.com/pickaxe/frameset.html"&gt;Programming Ruby - The Pragmatic Programmer's Guide&lt;/a&gt;, que esta sob licen&#231;a &lt;a href="http://www.opencontent.org/openpub/"&gt;Open Publication License&lt;/a&gt;. Vamos estudar!</description>
      <guid>/</guid>
    </item>
    <item>
      <title>Assertions no Ruby on Rails</title>
      <link>http://www.blogdopedro.net/2008/12/12/assertions-no-ruby-on-rails</link>
      <description>Cheat sheet resumindo a lista de assertions mais conhecidos no RoR.

&lt;a title="View ruby and rails assertions on Scribd" href="http://www.scribd.com/doc/5272/ruby-and-rails-assertions" style="margin: 12px auto 6px auto; font-family: Helvetica,Arial,Sans-serif; font-style: normal; font-variant: normal; font-weight: normal; font-size: 14px; line-height: normal; font-size-adjust: none; font-stretch: normal; -x-system-font: none; display: block; text-decoration: underline;"&gt;ruby and rails assertions&lt;/a&gt; &lt;object id="doc_761341431496664" name="doc_761341431496664" height="500" width="100%" type="application/x-shockwave-flash" data="http://d1.scribdassets.com/ScribdViewer.swf" style="outline:none;" &gt;		&lt;param name="movie" value="http://d1.scribdassets.com/ScribdViewer.swf"&gt;		&lt;param name="wmode" value="opaque"&gt; 		&lt;param name="bgcolor" value="#ffffff"&gt; 		&lt;param name="allowFullScreen" value="true"&gt; 		&lt;param name="allowScriptAccess" value="always"&gt; 		&lt;param name="FlashVars" value="document_id=5272&amp;access_key=39pn1jxn3wcg8&amp;page=1&amp;viewMode=list"&gt; 		&lt;embed id="doc_761341431496664" name="doc_761341431496664" src="http://d1.scribdassets.com/ScribdViewer.swf?document_id=5272&amp;access_key=39pn1jxn3wcg8&amp;page=1&amp;viewMode=list" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" height="500" width="100%" wmode="opaque" bgcolor="#ffffff"&gt;&lt;/embed&gt; 	&lt;/object&gt;</description>
      <guid>/</guid>
    </item>
    <item>
      <title>Canivete Su&#237;&#231;o do Shell</title>
      <link>http://www.blogdopedro.net/2008/12/11/canivete-suico-do-shell</link>
      <description>&lt;img style="float:left;width:209px;margin:0 10px 10px 0;" src="http://1.bp.blogspot.com/_gMGOvKSyf40/SUEZJsED8cI/AAAAAAAAALw/Fk_1zqQVGuI/s400/a.jpg" border="0" /&gt;Dica enviada pelo &lt;a href="http://www.escadologia.com/"&gt;Rafael "Peixe"&lt;/a&gt;: O &lt;a href="http://aurelio.net/"&gt;Aur&#233;lio Jargas&lt;/a&gt;, que possui um &#243;timo site com v&#225;rias dicas (em especial do mundo Unix e derivados), publicou h&#225; algum tempo uma lista de &lt;a href="http://aurelio.net/shell/canivete.html#codigos"&gt;comandos &#250;teis&lt;/a&gt; para se usar no Shell - tem at&#233; uma vers&#227;o PDF no final da p&#225;gina. Essas coisas sempre s&#227;o boas para se manter no bookmark do navegador...</description>
      <guid>/</guid>
    </item>
    <item>
      <title>GitHub</title>
      <link>http://www.blogdopedro.net/2008/12/10/github</link>
      <description>O &lt;a href="http://www.akitaonrails.com"&gt;F&#225;bio Akita&lt;/a&gt; lan&#231;ou um v&#237;deo muito interessante h&#225; algum tempo falando sobre como colaborar em um projeto no &lt;a href="http://www.github.com/"&gt;GitHub&lt;/a&gt;, e de quebra acaba dando uma palinha sobre o &lt;a href="http://pt.wikipedia.org/wiki/Git"&gt;git&lt;/a&gt;.

&lt;div align="center"&gt; &lt;object width="400" height="302"&gt;&lt;param name="allowfullscreen" value="true" /&gt;&lt;param name="allowscriptaccess" value="always" /&gt;&lt;param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=1780571&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=&amp;amp;fullscreen=1" /&gt;&lt;embed src="http://vimeo.com/moogaloop.swf?clip_id=1780571&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=&amp;amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="400" height="302"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;p&gt;&lt;a href="http://vimeo.com/1780571"&gt;Github colaborativo&lt;/a&gt; from &lt;a href="http://vimeo.com/akitaonrails"&gt;Fabio Akita&lt;/a&gt; on &lt;a href="http://vimeo.com"&gt;Vimeo&lt;/a&gt;.&lt;/p&gt; &lt;/div&gt;

Vlw pela dica &lt;a href="http://www.dx7lab.com/"&gt;Rafael&lt;/a&gt;.</description>
      <guid>/</guid>
    </item>
    <item>
      <title>Que tal bater um papo com a Eliza ?</title>
      <link>http://www.blogdopedro.net/2008/12/04/que-tal-bater-um-papo-com-a-eliza</link>
      <description>&lt;img style="float:left;height:300px;margin:0 10px 10px 0;" src="http://4.bp.blogspot.com/_gMGOvKSyf40/SThARwF6bxI/AAAAAAAAALg/H87Dm6Kd38Y/s400/woman.jpg" border="0" /&gt;Procurando um projeto interessante para fazer durante as f&#233;rias, tenho lido um pouco sobre &lt;a href="http://pt.wikipedia.org/wiki/Processamento_de_linguagem_natural"&gt;Processamento de Linguagem Natural&lt;/a&gt; (ou NLP) e esbarrei no &lt;a href="http://jerz.setonhill.edu/if/canon/eliza.htm"&gt;Eliza&lt;/a&gt;, um programa antigo usando NLP que simula um psiquiatra capaz de conversar sobre problemas humanos. Se algu&#233;m estiver interessado no assunto, eis a&#237; um exemplo online.</description>
      <guid>/</guid>
    </item>
    <item>
      <title>PHP.JS - port de fun&#231;&#245;es PHP para o Javascript</title>
      <link>http://www.blogdopedro.net/2008/11/28/phpjs-port-de-funcoes-php-para-o-javascript</link>
      <description>&lt;img style="float:left;width:210px;height:111px;margin:0 10px 10px 0;" src="http://2.bp.blogspot.com/_gMGOvKSyf40/STAErII7llI/AAAAAAAAALY/Ng7OKKG5B0w/s400/phpjs2.png" border="0" /&gt;Procurando algumas fun&#231;&#245;es Javascript que fossem equivalentes a fun&#231;&#245;es em PHP acabei esbarrando no projeto &lt;a href="http://kevin.vanzonneveld.net/techblog/article/javascript_equivalent_for_phps_in_array/"&gt;PHP.JS&lt;/a&gt;, que &#233; uma biblioteca Javascript com v&#225;rias fun&#231;&#245;es "portadas" do PHP. O contador do site deles informa que at&#233; a data deste post, 196 fun&#231;&#245;es j&#225; foram recriadas e parece que o projeto esta ativo.&lt;br /&gt;&lt;br /&gt;Como a biblioteca esta ficando cada vez mais extensa, consequentemente esta ficando cada vez mais pesada (52.kb comprimida e 219kb n&#227;o comprimida). Acho que o ideal &#233; ir adicionando ao projeto somente as fun&#231;&#245;es que forem sendo usadas, o que poupar&#225; bastante a conex&#227;o dos usu&#225;rios do seu site.</description>
      <guid>/</guid>
    </item>
    <item>
      <title>Helper button_to no Code Igniter</title>
      <link>http://www.blogdopedro.net/2008/11/17/helper-button-to-no-code-igniter</link>
      <description>&lt;img style="float:left;width:150px;margin:0 10px 10px 0;" src="http://1.bp.blogspot.com/_gMGOvKSyf40/SSGdPLGpmwI/AAAAAAAAALI/kczcQg2aAeI/s400/a.jpg" border="0" /&gt;O Rails tem um helper interessante que &#233; o button_to - ele cria um formul&#225;rio e bot&#227;o pra postagem com a op&#231;&#227;o de se passar um array para cria&#231;&#227;o de hiddens. Bem pr&#225;tico, se por exemplo voc&#234; tem uma listagem que tenha op&#231;&#245;es como excluir ou editar e voc&#234; n&#227;o ache elegante passar par&#226;metros por get. Trazendo para o mundo do CodeIgniter, para quem estiver escrevendo a view, tem a sensa&#231;&#227;o de que esta usando um &lt;span style="font-style:italic;"&gt;&amp;lt;php echo anchor('')&amp;gt;&lt;/span&gt; que posta dados.&lt;br /&gt;&lt;br /&gt;Copiando essa id&#233;ia do RoR para o CI, criei o helper button_to (pr&#234;mio para mim pela criatividade do nome) que tem o mesmo conceito. Cadastrei o helper no wiki do framework. Para acessar, &lt;a href="http://codeigniter.com/wiki/button_to/"&gt;clique aqui&lt;/a&gt;.</description>
      <guid>/</guid>
    </item>
    <item>
      <title>E ai, regulariza nossa profiss&#227;o ou n&#227;o ?</title>
      <link>http://www.blogdopedro.net/2008/11/12/e-ai-regulariza-nossa-profissao-ou-nao</link>
      <description>&lt;img style="float:left;height:350px;margin:0 10px 10px 0;" src="http://2.bp.blogspot.com/_gMGOvKSyf40/SRtHPYpbvSI/AAAAAAAAAKw/8NRJXafFJMQ/s400/marionete.jpg" border="0" /&gt;Essa discuss&#227;o ainda esta gerando muito bafaf&#225; entre as listas de emails. Na lista java-br mesmo surgiu (novamente) o tema. Confesso que fico preocupado mais em ver as esperan&#231;as de um mundo melhor na &#225;rea tecnol&#243;gica brasileira do que com a lei em si.&lt;br /&gt;&lt;br /&gt;Minha id&#233;ia sobre esse assunto &#233; a mesma que alguns sobre certifica&#231;&#227;o: ser&#225; mais um papel que funciona como uma linha imagin&#225;ria para ficar prendendo a aten&#231;&#227;o de pessoas que ainda lutam por algum reconhecimento no mercado. N&#227;o que todos que tenham ou almejam ter uma certifica&#231;&#227;o (seja na &#225;rea que for) s&#227;o profissionais ruins, mas os realmente bons sabem que possuem experi&#234;ncia o suficiente para mostrar suas capacidades sem depender dos canudos.&lt;br /&gt;&lt;br /&gt;Acho utopia a id&#233;ia de que com a regulamenta&#231;&#227;o teremos melhores profissionais pelos simples fato deles ter uma faculdade conclu&#237;da e pertencerem a algum sindicato. N&#227;o s&#243; pela fraca qualidade da "maioria das faculdades da maioria das pessoas", mas pela mentalidade de que um rolo de papel vai ser o Messias para essa bagun&#231;a.&lt;br /&gt;&lt;br /&gt;&#201; &#243;bvio que com a regulamenta&#231;&#227;o, os profissionais ter&#227;o mais burocracia e taxas pra pagar. Mesmo que seja montado um sindicato que fa&#231;a alguma coisa, ainda sim a mentalidade em muitos ser&#225; "preciso conseguir a matr&#237;cula no sindicato X" com a id&#233;ia de que isso os tornou grandes profissionais.&lt;br /&gt;&lt;br /&gt;Com a defici&#234;ncia que a empresas tem de m&#227;o de obra qualificada, o mercado ainda continuar&#225; incluindo p&#233;ssimos profissionais em detrimento dos bons profissionais. E essa id&#233;ia de que o governo ir&#225; fiscalizar as contrata&#231;&#245;es feitas pelas empresas permitindo somente a entrada de profissionais regularizados pode at&#233; funcionar nas grandes empresas, mas nas pequenas e m&#233;dias ainda sim os geeks "desregularizados" estar&#227;o l&#225;, mesmo com a carteira de trabalho assinada como "ajudante-geral-de-servi&#231;os-de-inform&#225;tica" (enquanto na verdade ele estar&#225; resolvendo problemas de escalabidade no principal sistema da empresa). Infelizmente a realidade &#233; assim&lt;br /&gt;&lt;br /&gt;Os bons profissionais sempre ter&#227;o boas oportunidades, com regulariza&#231;&#227;o ou n&#227;o. Sei que &#233; chato pensarmos em pagar alguma coisa a algum &#243;rg&#227;o para ele simplesmente dizer que voc&#234; sabe o que sabe, mas o mercado brasileiro gosta disso. Para reafirmar isso me aproprio de um pequeno trecho escrito pelo &lt;a href="http://www.improveit.com.br/empresa/vinicius"&gt;Vin&#237;cius Teles&lt;/a&gt; da &lt;a href="http://www.improveit.com.br"&gt;Improve It&lt;/a&gt;:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;Do ponto de vista comercial, aqui no Brasil, a certifica&#231;&#227;o &#233; uma jogada de mestre. As pessoas buscam, cada vez mais, todo tipo de selinho que puderem encontrar no mercado para colocar em seus curr&#237;culos. &#201; uma cultura insana, mas absolutamente pervasiva. Vai de pessoas a empresas.&lt;br /&gt;&lt;br /&gt;Fonte: &lt;a href="http://blog.improveit.com.br/articles/2007/12/19/novos-rumos-em-2008"&gt;http://blog.improveit.com.br/articles/2007/12/19/novos-rumos-em-2008&lt;/a&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;O Vin&#237;cius resumiu tudo: certifica&#231;&#227;o &#233; uma jogada de mestre. E assim como certifica&#231;&#227;o o &#233;, ser&#225; tamb&#233;m a carteirinha do sindicato. E voc&#234; possivelmente ver&#225; bons profissionais ignorando completamente a regulamenta&#231;&#227;o, bons profissionais se regularizando pra continuarem empregados e profissionais com qualidades question&#225;veis colocando a carteirinha em uma moldura na parede do quarto.</description>
      <guid>/</guid>
    </item>
    <item>
      <title>Web 2.0 no Slideshare</title>
      <link>http://www.blogdopedro.net/2008/11/10/web-20-no-slideshare</link>
      <description>&lt;img style="float:left;width:270px;margin:0 10px 10px 0;" src="http://4.bp.blogspot.com/_gMGOvKSyf40/SRibXJGVfOI/AAAAAAAAAKg/afniE990a74/s400/11.jpg" border="0" /&gt;O slideshare fez uma &lt;a href="http://www.slideshare.net/tag/web2summit"&gt;cole&#231;&#227;o com os slides&lt;/a&gt; publicados no &lt;a href="http://en.oreilly.com/web2008/public/content/home"&gt;Web 2.0 Summit 2008&lt;/a&gt;, evento promovido pela  O'Reilly no inicio deste m&#234;s. &lt;br /&gt;&lt;br /&gt;Confesso que fiquei ansioso para ver o material publicado, mas achei a maioria dos slides bem b&#225;sicos - acredito que as apresenta&#231;&#245;es em si tenham sido melhores. Procurando algum material no slideshare achei outros slides legais sobre o assunto. Posto alguns abaixo:

&lt;div align="center"&gt;
&lt;div style="width:425px" id="__ss_5316"&gt;&lt;strong style="display:block;margin:12px 0 4px"&gt;&lt;a href="http://www.slideshare.net/satyajeet_02/web-20-5316" title="Web 2.0"&gt;Web 2.0&lt;/a&gt;&lt;/strong&gt;&lt;object width="425" height="355"&gt;&lt;param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=web-20-5316-25603&amp;stripped_title=web-20-5316" /&gt;&lt;param name="allowFullScreen" value="true"/&gt;&lt;param name="allowScriptAccess" value="always"/&gt;&lt;embed src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=web-20-5316-25603&amp;stripped_title=web-20-5316" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div style="padding:5px 0 12px"&gt;View more &lt;a href="http://www.slideshare.net/"&gt;presentations&lt;/a&gt; from &lt;a href="http://www.slideshare.net/satyajeet_02"&gt;Satyajeet Singh&lt;/a&gt;.&lt;/div&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;div align="center"&gt;
&lt;div style="width:425px" id="__ss_54123"&gt;&lt;strong style="display:block;margin:12px 0 4px"&gt;&lt;a href="http://www.slideshare.net/heyjudeonline/creative-web-20-learning" title="Creative Web 2.0 Learning"&gt;Creative Web 2.0 Learning&lt;/a&gt;&lt;/strong&gt;&lt;object width="425" height="355"&gt;&lt;param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=creative-web-20-learning-5570&amp;stripped_title=creative-web-20-learning" /&gt;&lt;param name="allowFullScreen" value="true"/&gt;&lt;param name="allowScriptAccess" value="always"/&gt;&lt;embed src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=creative-web-20-learning-5570&amp;stripped_title=creative-web-20-learning" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div style="padding:5px 0 12px"&gt;View more &lt;a href="http://www.slideshare.net/"&gt;presentations&lt;/a&gt; from &lt;a href="http://www.slideshare.net/heyjudeonline"&gt;Judy O&amp;rsquo;Connell&lt;/a&gt;.&lt;/div&gt;&lt;/div&gt;
&lt;/div&gt;

Vale lembrar tamb&#233;m que est&#227;o surgindo aos poucos os v&#237;deos das palestras no canal da &lt;a href="http://www.youtube.com/user/OreillyMedia"&gt;O'Reilly no youtube&lt;/a&gt; .</description>
      <guid>/</guid>
    </item>
    <item>
      <title>Liderando equipes &#225;geis</title>
      <link>http://www.blogdopedro.net/2008/11/06/liderando-equipes-ageis</link>
      <description>O &lt;a href="http://gc.blog.br/"&gt;Guilherme Chapiewski&lt;/a&gt; publicou no slideshare os slides de sua apresenta&#231;&#227;o no Falando em Agile 2008, onde ele falou sobre Lideran&#231;a de Equipes &#193;geis. 

&lt;div align="center"&gt;&lt;div style="width:425px" id="__ss_704261"&gt;&lt;strong style="display:block;margin:12px 0 4px"&gt;&lt;a href="http://www.slideshare.net/gchapiewski/liderando-equipes-geis-presentation" title="Liderando Equipes &#193;geis"&gt;Liderando Equipes &#193;geis&lt;/a&gt;&lt;/strong&gt;&lt;object width="425" height="355"&gt;&lt;param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=liderandoequipesageis-1225337849939952-8&amp;stripped_title=liderando-equipes-geis-presentation" /&gt;&lt;param name="allowFullScreen" value="true"/&gt;&lt;param name="allowScriptAccess" value="always"/&gt;&lt;embed src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=liderandoequipesageis-1225337849939952-8&amp;stripped_title=liderando-equipes-geis-presentation" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div style="padding:5px 0 12px"&gt;View more &lt;a href="http://www.slideshare.net/"&gt;presentations&lt;/a&gt; from &lt;a href="http://www.slideshare.net/gchapiewski"&gt;Guilherme Chapiewski&lt;/a&gt;.&lt;/div&gt;&lt;/div&gt; &lt;/div&gt;</description>
      <guid>/</guid>
    </item>
    <item>
      <title>Aumentando a produtividade com os snippets</title>
      <link>http://www.blogdopedro.net/2008/10/29/aumentando-a-produtividade-com-os-snippets</link>
      <description>Uma &#243;tima dica para quem usa uma IDE ou editor decente &#233; usar os snippets, blocos de c&#243;digos reutiliz&#225;veis que "brotam" no seu c&#243;digo ap&#243;s o uso de uma keyword e um tab. &lt;br /&gt;&lt;br /&gt;&#201; impressionante como a maioria sabe disso mais deixam essa ferramenta de lado. Utilizando o Gedit hoje resolvi checar como criar novos snippets com coisas mais &#250;teis que for, if e foreach. Como tenho trabalhado em um projeto com CodeIgniter, fiz em poucos minutos snippets completos para cria&#231;&#227;o de controllers, models, helpers, libraries, etc. Al&#233;m do c&#243;digo em si, embuti os esqueletos dos coment&#225;rios no formado do phpDocumentator.&lt;br /&gt;&lt;br /&gt;Tive uma sens&#237;vel diferen&#231;a de produtividade, mesmo tendo parado para criar os snippets. Agora entendo porque o Pragmatic Programmer bate na tecla dos script generators. Realmente ajuda.&lt;br /&gt;&lt;br /&gt;Para habilitar os snippets no GEdit, basta ir em Edit -&amp;gt; Preferences -&amp;gt; Plugins e selecionar o plugin snippets.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_gMGOvKSyf40/SQjIkX-Nb5I/AAAAAAAAAJo/Kb4tTIxHQ4Y/s1600-h/Screenshot-gedit+Preferences.png"&gt;&lt;img style="display:block;text-align:center;cursor:hand;width:319px;height:400px;margin:0 auto 10px;" src="http://1.bp.blogspot.com/_gMGOvKSyf40/SQjIkX-Nb5I/AAAAAAAAAJo/Kb4tTIxHQ4Y/s400/Screenshot-gedit+Preferences.png" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Clicando no bot&#227;o Configure Plugin na mesma janela, voc&#234; pode ver todos os Snippets criados e criar os seus. Para criar um snippet novo n&#227;o tem mist&#233;rio algum, basta olhar os outros que voc&#234; pega o jeito da coisa f&#225;cil f&#225;cil.&lt;br /&gt;&lt;br /&gt;A &#250;nica coisa que achei estranho no GEdit &#233; que voc&#234; s&#243; pode configurar o plugin do snippet se tiver com um arquivo de extens&#227;o reconhecida aberto no Editor. Se estiver s&#243; com um Unsaved Document aberto por exemplo, ele n&#227;o deixa. &lt;br /&gt;&lt;br /&gt;Para quem ainda n&#227;o conseguiu "visualizar" a coisa toda, veja as duas imagens abaixo:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_gMGOvKSyf40/SQjJfJzCYmI/AAAAAAAAAJ4/fkpTewzsprI/s1600-h/Screenshot-snipet.php+(~-Desktop)+-+gedit.png"&gt;&lt;img style="display:block;text-align:center;cursor:hand;width:400px;height:285px;margin:0 auto 10px;" src="http://1.bp.blogspot.com/_gMGOvKSyf40/SQjJfJzCYmI/AAAAAAAAAJ4/fkpTewzsprI/s400/Screenshot-snipet.php+(~-Desktop)+-+gedit.png" border="0" /&gt;&lt;/a&gt; &lt;br /&gt;&lt;br /&gt;Criei o snippet cicontroller para construir controllers do CodeIgniter. Agora, depois de digitar essa keyword dar um tab, tenho isso:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_gMGOvKSyf40/SQjJ7xvJO4I/AAAAAAAAAKA/HJUSSVnzfi0/s1600-h/Screenshot+gedit2.png"&gt;&lt;img style="display:block;text-align:center;cursor:hand;width:400px;height:285px;margin:0 auto 10px;" src="http://3.bp.blogspot.com/_gMGOvKSyf40/SQjJ7xvJO4I/AAAAAAAAAKA/HJUSSVnzfi0/s400/Screenshot+gedit2.png" border="0" /&gt;&lt;/a&gt;</description>
      <guid>/</guid>
    </item>
    <item>
      <title>Usando Google como ferramenta Wiki</title>
      <link>http://www.blogdopedro.net/2008/10/28/usando-google-como-ferramenta-wiki</link>
      <description>&lt;img style="float:left;width:200px;margin:0 10px 10px 0;" src="http://1.bp.blogspot.com/_gMGOvKSyf40/SQd8rUQuyNI/AAAAAAAAAJA/u_02uOskBcc/s400/w.gif" border="0" /&gt;N&#227;o sei se todos sabem, mas o &lt;a href="http://sites.google.com/"&gt;Google Sites&lt;/a&gt; &#233; tamb&#233;m um eficiente Wiki empresarial. Basta criar o site, n&#227;o defini-lo como p&#250;blico, convidar os envolvidos no projeto e pronto. O Google Sites tem todas as ferramentas de um Wiki decente.&lt;br /&gt;&lt;br /&gt;Sei que para algumas empresas colocar suas documenta&#231;&#245;es em uma ferramenta externa (e de terceiros) pode ser um pesadelo, mas para outras poder terceirizar a manuten&#231;&#227;o de um sistema de apoio ao desenvolvimento &#233; um al&#237;vio. &lt;br /&gt;&lt;br /&gt;Outras ferramentas para Wiki interessantes s&#227;o: o &lt;a href="http://www.mediawiki.org/wiki/MediaWiki"&gt;MediaWiki&lt;/a&gt; (gratuito) em php, o &lt;a href="http://twiki.org/"&gt;TWiki&lt;/a&gt; (gratuito) em perl ou o &lt;a href="http://www.atlassian.com/software/confluence/"&gt;Confluence&lt;/a&gt; (comercial) em Java.&lt;br /&gt;&lt;br /&gt;Update 1: O &lt;a href="http://dx7lab.com"&gt;Rafael Dx7&lt;/a&gt; achou o projeto &lt;a href="http://rubyforge.org/projects/instiki/"&gt;Instiki&lt;/a&gt; no RubyForge, que tamb&#233;m &#233; free. Como o site estava fora e eu n&#227;o sabia que ele estava hospedado em outro lugar, acabei deixando de fora. Vlw pela dica!&lt;br /&gt;&lt;br /&gt;Update 2: &#211;tima r&#233;plica do Rafael, para ler &lt;a href="http://dx7lab.com/projetos-comunidades"&gt;clique aqui&lt;/a&gt;.</description>
      <guid>/</guid>
    </item>
    <item>
      <title>The Lego Hypothesis</title>
      <link>http://www.blogdopedro.net/2008/10/21/the-lego-hypothesis</link>
      <description>&lt;img style="float:left;margin:0 10px 10px 0;" src="http://4.bp.blogspot.com/_gMGOvKSyf40/SP3fXsgSadI/AAAAAAAAAIg/BAiTX0c57uY/s400/imagem.jpg" border="0" /&gt;Concorrendo ao pr&#234;mio de Palestra que Mais Usou Analogias do ano, o professor James Noble conseguiu criar bons paralelos entre o desenvolvimento de softwares e lego. A m&#225;xima da palestra &#233; desenvolvermos software menos acoplados e mais reaproveit&#225;veis - "Programs can be built out of many small independent components". &lt;br /&gt;&lt;br /&gt;Para assistir o v&#237;deo, &lt;a href="http://www.infoq.com/presentations/lego-hypothesis"&gt;clique aqui&lt;/a&gt;.</description>
      <guid>/</guid>
    </item>
    <item>
      <title>Layout e Elements no CodeIgniter</title>
      <link>http://www.blogdopedro.net/2008/10/17/layout-e-elements-no-codeigniter</link>
      <description>&lt;img style="float:left;margin:0 20px 20px 0;" src="http://4.bp.blogspot.com/_gMGOvKSyf40/SPim-DhJ9VI/AAAAAAAAAIY/A10EKjODIdo/s400/codeigniter.png" border="0" /&gt;Primeiramente quero pedir desculpas a galera que acessa o blog diariamente, j&#225; que notaram que o blog tem uma semana sem atualiza&#231;&#245;es! Mas n&#227;o fiquem com raiva : como recompensa consegui autoriza&#231;&#227;o de um grande autor gringo para publicar seus artigos traduzidos. Em breve falo mais sobre isso. &lt;br /&gt;&lt;br /&gt;Estamos na correria aqui na 3Jane passando um projeto do CakePHP para o Code Igniter. Uma das primeiras coisas que precisamos criar no Code Igniter foi o esquema de Layouts e Elements (como no Cake). N&#227;o d&#225; pra acreditar que o Code Igniter n&#227;o venha com algo built-in, mas, felizmente o CI tem algumas formas de voc&#234; construir adds.&lt;br /&gt;&lt;br /&gt;Eu sei que quem trabalha com o Code Igniter mais tempo vai reclamar feito uma velha ranzinza "mas j&#225; existem uns 10 sites falando sobre como plugar algum esquema de layout no CI". Eu realmente achei algumas solu&#231;&#245;es na web mas nem sempre se propunham a resolver meu problema de uma maneira simples e "desacoplada". Um simples exemplo &#233; a &lt;a href="http://codeigniter.com/wiki/layout_library/"&gt;Layout Library&lt;/a&gt; do pr&#243;prio site do CodeIgniter, que &#233; bem completa mas, para funcionar voc&#234; tem que substituir a chamada da view das actions dos seus controllers por um m&#233;todo pr&#243;prio. Al&#233;m do problema da refatora&#231;&#227;o do c&#243;digo, isso acaba fugindo do padr&#227;o do CodeIgniter ( que &#233; o que eu tenho mais medo). E nem me venha falar daquelas solu&#231;&#245;es que usam hooks...&lt;br /&gt;&lt;br /&gt;Para chegar a algo que me atendesse, eu peguei  a Library acima e dei uma adaptada para funcionar sobreescrevendo o Loader padr&#227;o para trabalhar com o esquema de Layouts - e acrescentei um m&#233;todo para trabalhar com Elements tamb&#233;m. Vamos lah:&lt;br /&gt;&lt;br /&gt;Crie uma library parecida com a seguinte:

&lt;code&gt;&amp;lt;?php if (!defined('BASEPATH')) exit('No direct script access allowed');&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt; * Customized Loader Class&lt;br /&gt; *&lt;br /&gt; * Overwrite default Loader which loads views and files&lt;br /&gt; *&lt;br /&gt; */&lt;br /&gt;class MY_Loader extends CI_Loader {&lt;br /&gt;&lt;br /&gt; var $layout = "default";&lt;br /&gt;&lt;br /&gt; function MY_Loader() {&lt;br /&gt;  parent::CI_Loader();&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; /**&lt;br /&gt;  * Load View&lt;br /&gt;  *&lt;br /&gt;  * This function is used to load a "view" file, including layout.  It has three parameters:&lt;br /&gt;  *&lt;br /&gt;  * 1. The name of the "view" file to be included.&lt;br /&gt;  * 2. An associative array of data to be extracted for use in the view.&lt;br /&gt;  * 3. TRUE/FALSE - whether to return the data or load it.  In&lt;br /&gt;  * some cases it's advantageous to be able to return data so that&lt;br /&gt;  * a developer can process it in some way.&lt;br /&gt;  *&lt;br /&gt;  * @access public&lt;br /&gt;  * @param string&lt;br /&gt;  * @param array&lt;br /&gt;  * @param bool&lt;br /&gt;  * @return void&lt;br /&gt;  */&lt;br /&gt; function view($view, $data = null, $return = FALSE) {&lt;br /&gt;&lt;br /&gt;  $loadedData = array();&lt;br /&gt;  $loadedData['content_for_layout'] = parent::view($view,$data,true);&lt;br /&gt;&lt;br /&gt;  if($return) {&lt;br /&gt;   $output = parent::view('layouts/' . $this-&amp;gt;layout, $loadedData, true);&lt;br /&gt;   return $output;&lt;br /&gt;  } else {&lt;br /&gt;   parent::view('layouts/' . $this-&amp;gt;layout, $loadedData, false);&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; /**&lt;br /&gt;  * Load View Element&lt;br /&gt;  *&lt;br /&gt;  * This function is used to load a "view" element file, simulating CakePHP's elements.&lt;br /&gt;  *&lt;br /&gt;  * 1. The name of the "element" file to be included.&lt;br /&gt;  * 2. An associative array of data to be extracted for use in the element.&lt;br /&gt;  *&lt;br /&gt;  * @access public&lt;br /&gt;  * @param string&lt;br /&gt;  * @param array&lt;br /&gt;  * @return string&lt;br /&gt;  */&lt;br /&gt; function element($element, $data = null) {&lt;br /&gt;  return parent::view('elements/' . $element, $data, TRUE);&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; /**&lt;br /&gt;  * Set Layout&lt;br /&gt;  *&lt;br /&gt;  * This function is used to set layout name&lt;br /&gt;  *&lt;br /&gt;  * 1. The name of the "layout" file to be renderized in view function.&lt;br /&gt;  *&lt;br /&gt;  * @access public&lt;br /&gt;  * @param string&lt;br /&gt;  * @return void&lt;br /&gt;  */&lt;br /&gt; function set_layout($value) {&lt;br /&gt;  $this-&amp;gt;layout = $value ;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt;}&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Teoricamente &#233; s&#243; isso, copiar a library acima para o diret&#243;rio de bibliotecas, criar os diret&#243;rios &lt;b&gt;layouts&lt;/b&gt; e &lt;b&gt;elements&lt;/b&gt; dentro do diret&#243;rio &lt;b&gt;views&lt;/b&gt; e criar um layout padr&#227;o. Com isso seu site j&#225; estar&#225; funcionando com layouts, sem precisar mudar suas actions ou criar hooks.&lt;br /&gt;&lt;br /&gt;Explicando melhor, a library primeiro renderiza a view solicitada e depois coloca o resultado dentro do layout e o renderiza. Como j&#225; disse, fixei que todos os layouts estar&#227;o dentro da pasta layouts dentro das views, mas voc&#234; pode mudar isso. Criei tamb&#233;m o set_layout, que me recurso a explicar pra que funciona. E por fim os elements s&#227;o "views" disfar&#231;adas, que sempre retornam a view renderizada como string. Acho que os elements nem s&#227;o t&#227;o necess&#225;rios pra todos, mas os fiz s&#243; pra for&#231;ar o pessoal a concentrar o elementos no mesmo lugar. &lt;br /&gt;&lt;br /&gt;Um layout (j&#225; usando um elemento) poderia ser o seguinte:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&amp;lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;html xmlns="http://www.w3.org/1999/xhtml"&amp;gt;&lt;br /&gt;&lt;br /&gt; &amp;lt;head&amp;gt;&lt;br /&gt;&lt;br /&gt;  &amp;lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8" /&amp;gt;&lt;br /&gt;  &amp;lt;title&amp;gt; Titulo &amp;lt;/title&amp;gt;&lt;br /&gt;&lt;br /&gt; &amp;lt;/head&amp;gt;&lt;br /&gt;&lt;br /&gt; &amp;lt;body&amp;gt;&lt;br /&gt;  &lt;br /&gt;   &amp;lt;h1&amp;gt; Esta carregando o layout &amp;lt;/h1&amp;gt;&lt;br /&gt;   &lt;br /&gt;   &amp;lt;?= $this-&amp;gt;load-&amp;gt;element('banner.php'); ?&amp;gt;&lt;br /&gt;    &lt;br /&gt;   &lt;br /&gt;   &amp;lt;!-- Conteudo --&amp;gt;&lt;br /&gt;   &amp;lt;?=$content_for_layout?&amp;gt;&lt;br /&gt;&lt;br /&gt; &amp;lt;/body&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;O elemento banner acima &#233; uma view normal, por isso nem vou postar o exemplo. Quem quiser uma c&#243;pia do framework seco s&#243; com o esquema de layouts funcionando, eu coloquei no &lt;a href="http://rapidshare.com/files/154903215/CodeIgniter_1.6.3.zip.html"&gt;rapidshare&lt;/a&gt;. A vers&#227;o da framework &#233; 1.6.3 ent&#227;o cheque no site do CodeIgniter qual &#233; a vers&#227;o atual antes de come&#231;ar a desenvolver em cima da c&#243;pia que estou disponibilizando.</description>
      <guid>/</guid>
    </item>
    <item>
      <title>Projetos PHP e Integra&#231;&#227;o Cont&#237;nua</title>
      <link>http://www.blogdopedro.net/2008/10/09/projetos-php-e-integracao-continua</link>
      <description>&lt;img style="float:left;margin:0 10px 10px 0;" width="200px" src="http://3.bp.blogspot.com/_gMGOvKSyf40/SO4d19n3thI/AAAAAAAAAIQ/Qd0Tm7Gejlo/s400/mupets.jpg" border="0" /&gt;Estamos lutando aqui na &lt;a href="http://www.3jane.com/"&gt;3Jane&lt;/a&gt; para alcan&#231;armos um formato indolor de Continuous Integration ( &lt;a href="http://martinfowler.com/articles/continuousIntegration.html"&gt;aqui&lt;/a&gt; e &lt;a href="http://en.wikipedia.org/wiki/Continuous_Integration"&gt;aqui&lt;/a&gt; ) em nossos projetos - que s&#227;o (at&#233; ent&#227;o) em PHP. &lt;br /&gt;&lt;br /&gt;Existe um n&#250;mero relevante de ferramentas dispon&#237;veis, o problema esta sendo fazer com que elas sigam um fluxo natural no projeto. Ou as ferramentas precisam de uma adapta&#231;&#227;o para PHP (como o &lt;a href="http://cruisecontrol.sourceforge.net/"&gt;CruiseControl&lt;/a&gt; com o &lt;a href="http://www.phpundercontrol.org/"&gt;PHPUnderControl&lt;/a&gt;), ou as ferramentas n&#227;o se encaixam, ou s&#227;o muito limitadas.&lt;br /&gt;&lt;br /&gt;Embora um pouco complexo, estamos achando algumas coisas boas. Para come&#231;ar, tinhamos decidido apostar no &lt;a href="http://www.cakephp.com.br/"&gt;CakePHP&lt;/a&gt;, um framework s&#243;lido e com grande similaridade com o Rails. Ficamos realmente satisfeitos com a organiza&#231;&#227;o da "crian&#231;a" e de como ele &#233; bem feito. E tamb&#233;m tem o fato de que o CakePHP j&#225; vem com uma integra&#231;&#227;o com o &lt;a href="http://simpletest.org/"&gt;SimpleTest&lt;/a&gt;, que at&#233; onde pude ver, a ponte entre eles &#233; s&#243;lida e sem "adapta&#231;&#245;es" incomodas - at&#233; porque o SimpleTest tamb&#233;m &#233; em PHP. &lt;br /&gt;&lt;br /&gt;Acontece que pelo CakePHP ser bem completo, ele tamb&#233;m &#233; mais lento que outros frameworks e por motivos de for&#231;a maior decidimos trocar para o &lt;a href="http://codeigniter.com/"&gt;Code Igniter&lt;/a&gt;, que tamb&#233;m &#233; um bom framework, mas n&#227;o possui tantas camadas quanto o CakePHP e teremos que "digitar mais". Outro ponto fraco do Code Igniter com rela&#231;&#227;o ao CakePHP &#233; o bake, que &#233; um script generator do CakePHP que agiliza muito a vida. &lt;br /&gt;&lt;br /&gt;Quanto aos testes no Code Igniter ele j&#225; vem com uma library bem simples para teste unit&#225;rio, mas &#233; t&#227;o simples que estou propondo aqui que troquemos para o SimpleTest ou &lt;a href="http://www.phpunit.de/"&gt;PHPUnit&lt;/a&gt;. Como este &#250;ltimo parece ter uma &lt;a href="http://blog.diegotremper.com/archives/103"&gt;integra&#231;&#227;o com o PHPUndercontrol&lt;/a&gt;, estou lendo como plug&#225;-lo ao CodeIgniter.&lt;br /&gt;&lt;br /&gt;J&#225; constru&#237;mos o &lt;a href="http://www.blogdopedro.net/2008/08/tracer-bullet.html"&gt;Tracer Bullet&lt;/a&gt; para os testes do ambiente e estamos implantando-o. Estou vendo o &lt;a href="http://phing.info/"&gt;Phing&lt;/a&gt; para automatizar o processo de deploy, mas ainda n&#227;o parei para estuda-lo de verdade. Essa &#233; uma das minhas metas nos pr&#243;ximos dias.&lt;br /&gt;&lt;br /&gt;Para controle de c&#243;digo, migramos do &lt;a href="http://msdn.microsoft.com/en-us/vs2005/aa718670.aspx"&gt;SourceSafe&lt;/a&gt; para o &lt;a href="http://subversion.tigris.org/"&gt;SubVersion&lt;/a&gt; e apesar de alguns problemas com o &lt;a href="http://tortoisesvn.tigris.org/"&gt;Tortoise&lt;/a&gt;, valeu a pena. Pra ser bem sincero, o engra&#231;ado &#233; como sempre os problemas envolvem o Windows. Para controle de bug/issues estamos usando o &lt;a href="http://www.atlassian.com/software/jira/"&gt;Jira&lt;/a&gt; e como Wiki o &lt;a href="http://www.atlassian.com/software/confluence/"&gt;Confluence&lt;/a&gt;. Ah, e para a documenta&#231;&#227;o do nosso c&#243;digo estamos usando o &lt;a href="http://www.phpdoc.org/"&gt;phpDocumentator&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Ufa! Acho que &#233; isso... O problema &#233; conseguir tempo pra ver tudo isso e dar continuidade no projeto. Mas posso dizer que demos um "salto qu&#226;ntico" no processo de desenvolvimento aqui na 3Jane. Se voc&#234; quiser uma lista organizada e decente das ferramentas que podem te ajudar no desenvolvimento em projetos PHP, o Dave Marshall publicou um top 10 no &lt;a href="http://www.davedevelopment.co.uk/tag/phpundercontrol/"&gt;blog dele&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Por fim, deixo com voc&#234;s um slide falando sobre PHP + Continuous Integration : 

&lt;div align="center"&gt;&lt;div style="width:425px" id="__ss_277790"&gt;&lt;strong style="display:block;margin:12px 0 4px"&gt;&lt;a href="http://www.slideshare.net/arnoschn/continuous-integration-and-php" title="Continuous Integration and PHP"&gt;Continuous Integration and PHP&lt;/a&gt;&lt;/strong&gt;&lt;object width="425" height="355"&gt;&lt;param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=continuous-integration-and-php-1203717119983797-3&amp;stripped_title=continuous-integration-and-php" /&gt;&lt;param name="allowFullScreen" value="true"/&gt;&lt;param name="allowScriptAccess" value="always"/&gt;&lt;embed src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=continuous-integration-and-php-1203717119983797-3&amp;stripped_title=continuous-integration-and-php" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div style="padding:5px 0 12px"&gt;View more &lt;a href="http://www.slideshare.net/"&gt;presentations&lt;/a&gt; from &lt;a href="http://www.slideshare.net/arnoschn"&gt;Arno Schneider&lt;/a&gt;.&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</description>
      <guid>/</guid>
    </item>
    <item>
      <title>E-books de gra&#231;a no InfoQ BookShelf</title>
      <link>http://www.blogdopedro.net/2008/10/08/e-books-de-graca-no-infoq-bookshelf</link>
      <description>&lt;img style="float:left;margin:0 15px 10px 0;" src="http://1.bp.blogspot.com/_gMGOvKSyf40/SOz19TvFirI/AAAAAAAAAII/NBAkXNHeyyA/s400/logo.gif" border="0" /&gt;Para quem n&#227;o conhece, o &lt;a href="http://www.infoq.com"&gt;InfoQ&lt;/a&gt; possui um pequeno acervo de bons ebooks disponibilizados gratuitamente. Voc&#234; se registra e pode baixar qualquer ebook de gra&#231;a. Existe tamb&#233;m a op&#231;&#227;o de compra impressa, mas com as taxas de importa&#231;&#227;o mais esse d&#243;lar que n&#227;o para de subir, aconselho a imprimir na x&#233;rox do seu Jo&#227;o na esquina mais pr&#243;xima da sua casa. &lt;br /&gt;&lt;br /&gt;No site existem alguns ebooks como Composite Software Construction, Scrum and XP from the Trenches, Starting Struts 2, Agile Patterns: The Technical Cluster, Mr. Neighborly's Humble Little Ruby Book, Getting Started with Grails, Domain Driven Design Quickly, Scrum Checklists, Enterprise SOA Adoption Strategies e outros.</description>
      <guid>/</guid>
    </item>
    <item>
      <title>Max Gehringer e sua opin&#227;o sobre o profissional de TI no futuro</title>
      <link>http://www.blogdopedro.net/2008/10/03/max-gehringer-e-sua-opinao-sobre-o-profissional-de-ti-no-futuro</link>
      <description>&lt;img width="250px" style="float:left;margin:0 10px 10px 0;" src="http://2.bp.blogspot.com/_gMGOvKSyf40/SOY59xf-XWI/AAAAAAAAAHw/7VkrEINkGJc/s400/b.jpg" border="0" /&gt;A ComputerWorld publicou uma entrevista com Max Gehringer sobre sua vis&#227;o do profissional de TI do futuro. Embora meio &#243;bvia, destaca como as empresas devem se posicionar para conseguir manter algum empregado de TI nos pr&#243;ximos anos.&lt;br /&gt;&lt;br /&gt;Infelizmente a ComputerWorld n&#227;o permite o sharing total/parcial de seus textos (no donuts for u), portanto, o m&#225;ximo que posso fazer &#233; deixar o &lt;a href="http://computerworld.uol.com.br/carreira/2008/10/02/o-profissional-de-ti-do-futuro-na-opiniao-de-max-gehringer/"&gt;link&lt;/a&gt;.</description>
      <guid>/</guid>
    </item>
    <item>
      <title>Gerenciador de pacotes para Slackware</title>
      <link>http://www.blogdopedro.net/2008/10/02/gerenciador-de-pacotes-para-slackware</link>
      <description>&lt;img style="float:left;margin:30px 10px 10px 0;" src="http://3.bp.blogspot.com/_gMGOvKSyf40/SOVCLNeH4HI/AAAAAAAAAHo/WFvwuGO9SOw/s400/Distro-Slackware-logo.png" border="0" /&gt;&#211;tima not&#237;cia para os usu&#225;rios do Slackware: o &lt;a href="http://slackbuilds.org/"&gt;Slackbuilds.org&lt;/a&gt;, site conhecido como uma das principais fontes de pacotes para Slackware, disponibilizou uma ferramenta chamada &lt;a href="http://code.google.com/p/sbopkg/"&gt;Sbopkg&lt;/a&gt;, que &#233; uma uma ferramenta que cria uma ponte entre o &lt;a href="http://pt.wikipedia.org/wiki/Pkgtool"&gt;pkgtool&lt;/a&gt; e reposit&#243;rio do pr&#243;prio Slackbuilds, permitindo atualizar ou instalar seus pacotes. &lt;br /&gt;&lt;br /&gt;Ainda n&#227;o tive tempo pra testar mas prometo dar um feedback quando usar a ferramenta. Confesso que de uns tempos pra c&#225; estava usando mais o &lt;a href="http://linuxpackages.net/"&gt;linuxpackages&lt;/a&gt; para baixar os pacotes do Slack, mas se a ferramenta funcionar ser&#225; o improvement que faltava para a nossa estimada distro linux.&lt;br /&gt;&lt;br /&gt;Pra quem esta por fora, existe tamb&#233;m o &lt;a href="http://www.vivaolinux.com.br/artigo/Slaptget-pratico-e-eficiente-para-atualizar-o-sistema-e-baixar-programas-novos/"&gt;slapt-get&lt;/a&gt; que tenta ser uma c&#243;pia do apt-get dos Debians da vida para o Slack. Eu n&#227;o sei se &#233; preconceito meu mas eu n&#227;o gosto muito. A &#250;nica coisa que pode vir a me fazer gostar da Sbopkg, al&#233;m da integra&#231;&#227;o com o pkgtool &#233; o pr&#243;prio Slackbuilds, que cujos pacotes sempre rodaram redondo na minha m&#225;quina... Vamos ver no d&#225;.</description>
      <guid>/</guid>
    </item>
    <item>
      <title>Fearless Change Pattern</title>
      <link>http://www.blogdopedro.net/2008/10/01/fearless-change-pattern</link>
      <description>&lt;img style="float:left;margin:0 10px 10px 0;" src="http://4.bp.blogspot.com/_gMGOvKSyf40/SOONkulANiI/AAAAAAAAAG0/1vugfkVm8zg/s400/LindaRising.jpg" border="0" /&gt;Mais um v&#237;deo interessante do InfoQ, uma entrevista com &lt;a href="http://www.lindarising.org/"&gt;Linda Rising&lt;/a&gt; ( autora do Livro &lt;a href="http://portal.acm.org/citation.cfm?id=518257"&gt;Patterns Almanac&lt;/a&gt; ). Ela fala sobre algo muito importante presente em qualquer mudan&#231;a de paradigmas: o medo de mudan&#231;a.&lt;br /&gt;&lt;br /&gt;Qualquer padr&#227;o novo envolve o medo do erro. Quanto maior o risco de erro, maior o medo. E por isso muitas empresas param no tempo. Com essa introdu&#231;&#227;o ela segue a entrevista identificando fatores para uma mudan&#231;a sem medo. Para ver a entrevista, &lt;a href="http://www.infoq.com/interviews/Linda-Rising-Fearless-Change"&gt;clique aqui&lt;/a&gt;.</description>
      <guid>/</guid>
    </item>
    <item>
      <title>Ubuntu Kung Fu</title>
      <link>http://www.blogdopedro.net/2008/09/28/ubuntu-kung-fu</link>
      <description>&lt;img style="float:left;margin:0 10px 10px 0;" src="http://2.bp.blogspot.com/_gMGOvKSyf40/SN7eDIiNYlI/AAAAAAAAAFk/_pIQf7kZ-Ok/s400/ktuk.jpg" border="0" /&gt;Boa not&#237;cias para os f&#227;s do Ubuntu: o grupo The Pragmatic Programmers acaba de lan&#231;ar o livro &lt;a href="http://www.pragprog.com/titles/ktuk/ubuntu-kung-fu"&gt;Ubuntu Kung Fu&lt;/a&gt;, ressaltando os poderes da distro ( e como as pessoas os desconhecem). Embora n&#227;o concorde com a frase &lt;span style="font-weight:bold;"&gt;It&#8217;s the best Linux distribution ever&lt;/span&gt;, o livro promete trazer mais de 300 dicas sobre o famoso filho do Debian, com foco em usu&#225;rios que vieram do Windows e do MacOS (s&#233;rio? E como ficam os milhares de usu&#225;rios do FreeBSD e do BeOS ?).&lt;br /&gt;&lt;br /&gt;Quem quiser um trecho do livro, eles disponibilizaram um PDF &lt;a href="http://media.pragprog.com/titles/ktuk/excerpts.pdf"&gt;aqui&lt;/a&gt;.</description>
      <guid>/</guid>
    </item>
    <item>
      <title>Materiais online de Stanford e MIT</title>
      <link>http://www.blogdopedro.net/2008/09/26/materiais-online-de-stanford-e-mit</link>
      <description>A universidade de Stanford disponibiliza alguns materiais de suas aulas do curso de Ci&#234;ncias da Computa&#231;&#227;o online, atrav&#233;s do programa &lt;a href="http://see.stanford.edu/SEE/Courses.aspx"&gt;Stanford Engineering Everywhere&lt;/a&gt;. Confesso que peguei o video de introdu&#231;&#227;o ao curso de CC e o carinha fala r&#225;pido hein... Mas nada imposs&#237;vel de pegar, principalmente com o tempo.&lt;br /&gt;&lt;br /&gt;Abaixo a aula de introdu&#231;&#227;o ao curso de CC:

&lt;div align="center"&gt; &lt;object width="480" height="385"&gt;&lt;param name="movie" value="http://www.youtube.com/v/KkMDCCdjyW8&amp;hl=en_US&amp;fs=1&amp;"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/KkMDCCdjyW8&amp;hl=en_US&amp;fs=1&amp;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="385"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;

Procurando por algum similar do MIT achei um tal de &lt;a href="http://ocw.mit.edu/OcwWeb/Science--Technology--and-Society/index.htm"&gt;MIT Open Courseware&lt;/a&gt;, que tem uma sess&#227;o de "Ci&#234;ncia, Tecnologia e Sociedade". N&#227;o &#233; t&#227;o bom quanto o curso online de Stanford, mas j&#225; &#233; alguma coisa tamb&#233;m.&lt;br /&gt;&lt;br /&gt;Vale lembrar que as duas universidades tem canais no Youtube: &lt;a href="http://www.youtube.com/user/stanforduniversity"&gt;Stanford&lt;/a&gt; e &lt;a href="http://www.youtube.com/user/MIT"&gt;MIT&lt;/a&gt;.</description>
      <guid>/</guid>
    </item>
    <item>
      <title>Test Driven Development</title>
      <link>http://www.blogdopedro.net/2008/09/25/test-driven-development</link>
      <description>Estamos aqui na &lt;a href="http://www.3jane.com"&gt;3Jane&lt;/a&gt; nos policiando para seguirmos as regras pregadas pelos processos &#225;geis. Uma delas &#233; o &lt;a href="http://en.wikipedia.org/wiki/Test-driven_development"&gt;desenvolvimento orientado a testes&lt;/a&gt;. Na verdade todos n&#243;s aqui j&#225; tinhamos lido sobre o assunto, mas agora vai ser lei.&lt;br /&gt;&lt;br /&gt;Falando de mundo PHP, temos basicamente dois frameworks para testes : o &lt;a href="http://www.phpunit.de/"&gt;PHPUnit&lt;/a&gt; e o &lt;a href="http://simpletest.org/"&gt;SimpleTest&lt;/a&gt;. At&#233; onde tenho lido, ambos fornecem diversos recursos para escrita de testes, entretando como o &lt;a href="http://www.cakephp.com.br/"&gt;CakePHP&lt;/a&gt; j&#225; possui um caso de amor com o SimpleTest, estou lendo mais sobre ele. &lt;br /&gt;&lt;br /&gt;Deixo abaixo um slide que encontrei no slideshare falando sobre TDD:

&lt;div align="center"&gt; &lt;div style="width:425px" id="__ss_451743"&gt;&lt;strong style="display:block;margin:12px 0 4px"&gt;&lt;a href="http://www.slideshare.net/belalraslan/software-testing-basics" title="Software Testing Basics"&gt;Software Testing Basics&lt;/a&gt;&lt;/strong&gt;&lt;object width="425" height="355"&gt;&lt;param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=software-testing-1212769140006982-8&amp;stripped_title=software-testing-basics" /&gt;&lt;param name="allowFullScreen" value="true"/&gt;&lt;param name="allowScriptAccess" value="always"/&gt;&lt;embed src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=software-testing-1212769140006982-8&amp;stripped_title=software-testing-basics" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div style="padding:5px 0 12px"&gt;View more &lt;a href="http://www.slideshare.net/"&gt;presentations&lt;/a&gt; from &lt;a href="http://www.slideshare.net/belalraslan"&gt;Belal Raslan&lt;/a&gt;.&lt;/div&gt;&lt;/div&gt; &lt;/div&gt;</description>
      <guid>/</guid>
    </item>
    <item>
      <title>Poster sobre desenvolvimento &#225;gil</title>
      <link>http://www.blogdopedro.net/2008/09/24/poster-sobre-desenvolvimento-agil</link>
      <description>&lt;img style="float:left;margin:0 10px 10px 0;" src="http://3.bp.blogspot.com/_gMGOvKSyf40/SNmH-G4Hg-I/AAAAAAAAAFc/P38BzrcYIvQ/s400/AgilePoster.jpg" border="0" /&gt;A &lt;a href="http://www.versionone.com"&gt;VersionOne&lt;/a&gt; possui um poster bastante claro sobre os subprocessos dentro do processo &#225;gil. Para fazer o download, voc&#234; tem que preencher um pequeno cadastro (nome e email). A p&#225;gina &#233; &lt;a href="http://www.versionone.com/agileposter.asp"&gt;essa&lt;/a&gt;.</description>
      <guid>/</guid>
    </item>
    <item>
      <title>Hist&#243;ria de falha de um projeto</title>
      <link>http://www.blogdopedro.net/2008/09/23/historia-de-falha-de-um-projeto</link>
      <description>&lt;img style="float:left;margin:0 10px 10px 0;" src="http://2.bp.blogspot.com/_gMGOvKSyf40/SNlbZKHaJyI/AAAAAAAAAFU/nYD0IqDP1h4/s400/scrum.JPG" border="0" /&gt;Recebi por email a newsletter do &lt;a href="http://www.infoq.com/"&gt;InfoQ&lt;/a&gt; e tinha o anuncio de um v&#237;deo interessante de um projeto que parecia ser bem-sucedido mas foi considerado um fracasso pelo cliente. &lt;br /&gt;Palestra foi gravada na &lt;a href="http://www.agile2008.org/"&gt;Agile 2008 Conference&lt;/a&gt;, pelo Mitch Lacey um &lt;a href="http://www.scrumalliance.org/training/#CST"&gt;CST&lt;/a&gt; e &lt;a href="http://en.wikipedia.org/wiki/Project_Management_Professional"&gt;PMP&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Para ver o v&#237;deo, &lt;a href="http://www.infoq.com/presentations/A-Story-of-Project-Failure-Mitch-Lacey"&gt;clique aqui&lt;/a&gt;.</description>
      <guid>/</guid>
    </item>
    <item>
      <title>PHP + YAML via SPYC</title>
      <link>http://www.blogdopedro.net/2008/09/22/php-yaml-via-spyc</link>
      <description>&lt;img style="float:left;margin:0 10px 10px 0;" src="http://2.bp.blogspot.com/_gMGOvKSyf40/SNemUnxC-RI/AAAAAAAAAFM/T94LqUPy5BA/s400/settings.png" border="0" /&gt;O Rails usa um formato muito simples de documentos para a substitui&#231;&#227;o do XML, o &lt;a href="http://en.wikipedia.org/wiki/YAML"&gt;YAML&lt;/a&gt;. Esse formato al&#233;m de extremamente &#225;gil &#233; mais "human friendly" que o XML.&lt;br /&gt;&lt;br /&gt;Procurando algum loader em PHP para esse formato, achei o &lt;a href="http://spyc.sourceforge.net/"&gt;SPYC&lt;/a&gt;. A implementa&#231;&#227;o &#233; simples, basta dar um Spyc::YAMLLoad('arquivo.yml') que ele carrega e gera um array - e voc&#234; tamb&#233;m pode fazer dump com ele.</description>
      <guid>/</guid>
    </item>
    <item>
      <title>Dica : Desenvolvimento Web &#193;gil com Rails</title>
      <link>http://www.blogdopedro.net/2008/09/13/dica-desenvolvimento-web-agil-com-rails</link>
      <description>&lt;a href="http://www.livrariacultura.com.br/scripts/cultura/externo/index.asp?id_link=5378&amp;amp;tipo=2&amp;amp;isbn=8577802647"&gt;&lt;img style="float:left;cursor:hand;margin:0 10px 10px 0;" src="http://3.bp.blogspot.com/_gMGOvKSyf40/SMtJqFdhd8I/AAAAAAAAAEs/GgJsppAoMTw/s400/2507098.jpg" border="0" /&gt;&lt;/a&gt;Pois &#233;, o &lt;a href="http://www.blogdopedro.net/2008/08/dica-pragmatic-programmer.html"&gt;ultimo livro&lt;/a&gt; que comprei acabou r&#225;pido ( terminei de ler at&#233; mesmo antes da fatura do cart&#227;o de cr&#233;dito ser emitida. Ser&#225; que posso devolver o livro ? ). Logo no inicio do The Pragmatic Programmers os autores falam sobre expandir continuamente seu conhecimento, lendo bons livros a todo momento e aprendendo pelo menos uma linguagem de programa&#231;&#227;o nova por ano. Tentando cumprir isso, tomei vergonha pra come&#231;ar a estudar Ruby on Rails de verdade. &lt;br /&gt;&lt;br /&gt;Como gostei &lt;span style="font-weight:bold;"&gt;muito&lt;/span&gt; do estilo usado pelo grupo &lt;a href="http://www.pragprog.com/"&gt;The Pragmatic Programmers&lt;/a&gt;, comprei o &lt;a href="http://www.livrariacultura.com.br/scripts/cultura/externo/index.asp?id_link=5378&amp;amp;tipo=2&amp;amp;isbn=8577802647"&gt;livro deles sobre Rails&lt;/a&gt;. J&#225; li umas 60 p&#225;ginas e estou sentindo que vai dar namoro. Provavelmente os posts sobre Rails no blog v&#227;o come&#231;ar aparecer ;-)</description>
      <guid>/</guid>
    </item>
    <item>
      <title>Dinheiro n&#227;o &#233; tudo</title>
      <link>http://www.blogdopedro.net/2008/09/13/dinheiro-nao-e-tudo</link>
      <description>&lt;img style="float:left;margin:0 10px 10px 0;" src="http://2.bp.blogspot.com/_gMGOvKSyf40/SMtVwj6O2SI/AAAAAAAAAE0/AE5M26g6M5U/s400/happyness.jpg" border="0" width="250px" /&gt;Em pleno s&#233;culo XXI, eu, cidad&#227;o das Am&#233;ricas (ainda que do Sul), venho com esse papo mole de que dinheiro n&#227;o &#233; tudo. Sei que a proposta do post &lt;a href="http://blog.improveit.com.br/articles/2008/08/27/receita-do-sucesso-fazer-o-que-voce-ama"&gt;n&#227;o &#233; nova&lt;/a&gt;, mas sei tamb&#233;m que tem muita gente que vai concordar comigo que &lt;span style="font-weight:bold;"&gt;dinheiro n&#227;o &#233; tudo&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;N&#243;s como meros desenvolvedores que somos por vezes somos a menor parte do processo de desenvolvimento de um software ( que paradoxo n&#227;o ?). Constantemente trabalhamos sobre press&#227;o, com prazos apertados, especifica&#231;&#245;es falhas e com legados de softwares que sofremos pra manter. Mas se &#233; t&#227;o ruim assim, por que continuamos ? Simples: porque amamos desenvolver software.  Achamos m&#225;gico construir solu&#231;&#245;es que acelerem o processo de comunica&#231;&#227;o entre os seres humanos, sejam eles quem forem. Gostamos de bits, patterns, miracle driven developments, aprender coisas novas pra agilizar os processos e por ai vai.&lt;br /&gt;&lt;br /&gt;Por isso nos envolvemos muito com o nosso trabalho. Saimos da empresa onde trabalhamos e vamos pra casa fazer o que ? Programar ou estudar programa&#231;&#227;o ainda mais - e isso normalmente invade nossos finais de semana. Por essa raz&#227;o n&#227;o &#233; dif&#237;cil imaginar que nos envolvemos e muito com o que fazemos, j&#225; que fazemos por que somos apaixonados por isso. &lt;br /&gt;&lt;br /&gt;E o que acontece quando percebemos que no ambiente onde trabalhamos existem processos ruins, que podiam ser otimizados mas que por "for&#231;a maior" n&#227;o os s&#227;o ? Perdemos nosso humor. Parece que a "inspira&#231;&#227;o" para programar acabou, perdemos o &#226;nimo para digitar um ponto-e-v&#237;gula sequer. Programador que ama o que faz n&#227;o consegue digerir muito bem essa coisa de "isso &#233; problema da empresa, as 18h vou pra casa tranquilo". &lt;br /&gt;&lt;br /&gt;E &#233; ai que entra o titulo do post "Dinheiro n&#227;o &#233; tudo". Ok, gostamos de dinheiro por que precisamos e por que nos tr&#225;s conforto, mas dinheiro n&#227;o compra entusiasmo - muito menos patrim&#244;nio intelectual. &lt;br /&gt;&lt;br /&gt;Por exemplo, sempre tem aquele papo de que todo programador deve virar gerente de projetos. Por qu&#234; ? Simples, porque gerente ganha mais. Mas, e se eu n&#227;o gostar de ficar "o dia todo de frente pro Project?" (hei isso foi uma piada, por favor ria) E se eu achar gra&#231;a em outra coisa? E se o que me deixa feliz &#233; digitar um bando de palavras em ingl&#234;s e apertar o F5 ? (preciso dizer que foi outra piada?). Quem disse que eu estou programando s&#243; por dinheiro?&lt;br /&gt;&lt;br /&gt;Por isso saiba discernir se voc&#234; esta construindo o seu futuro simplesmente pelo que vai ganhar ou pelo que vai viver. N&#227;o deixe seu prazer em desenvolver softwares da maneira correta enferrujar junto com os processos administrativos da sua empresa. Dinheiro &#233; bom, mas quando a gente morre fica tudo pra um bando de filhos ingratos que n&#227;o v&#227;o saber quantas linhas de c&#243;digo voc&#234; teve que escrever para consegui-lo. E se voc&#234; morrer sem filhos, alguma mulher vai acabar gastando sua grana mesmo. (Suellen isso foi s&#243; for&#231;a de express&#227;o tah amor...) N&#227;o substitua talento por desculpas. Se quando voc&#234; esta no trabalho, s&#243; fica pensando em ir embora e quando esta em casa fica com aquela sensa&#231;&#227;o de frusta&#231;&#227;o de voltar pra empresa, &#233; melhor voc&#234; dar uma olhada &lt;a target="_blank" href="http://www.youtube.com/watch?v=glofSn7xLDw&amp;amp;eurl=http://www.blogdopedro.net/"&gt;nesse v&#237;deo aqui&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Ps.: A prop&#243;sito, a foto do post &#233; do filme &lt;a target="_blank" href="http://www.youtube.com/watch?v=2tYV9iYr-DM"&gt;A procura da felicidade&lt;/a&gt;. Acho que fui o &#250;nico que achou o filme sensacional do inicio ao fim, mas mesmo assim se voc&#234; n&#227;o viu aconselho a faz&#234;-lo.</description>
      <guid>/</guid>
    </item>
    <item>
      <title>LHC usa Linux</title>
      <link>http://www.blogdopedro.net/2008/09/11/lhc-usa-linux</link>
      <description>&lt;img style="float:left;margin:0 10px 10px 0;" src="http://4.bp.blogspot.com/_gMGOvKSyf40/SMkyqAqUX4I/AAAAAAAAAEk/xtgy3G8kRUE/s400/lhc_tux.jpg" border="0" /&gt;Legal n&#227;o ? Pelo menos agora eu j&#225; sei que o mundo n&#227;o vai acabar com uma tela azul. O texto a seguir foi tirado da &lt;a href="http://blog.internetnews.com/skerner/2008/09/large-hadron-collider---powere.html"&gt;Internet News&lt;/a&gt; :&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;"The most powerful physics project in the history of the known universe - The $10 Billion Large Hadron Collider (LHC)- shot its first light speed beam this morning around its 27 km circuit. Beyond the 20 years it took to build and half of all the world's astrophysicists, it also takes another key ingredient to make LHC work -- Linux. &lt;br /&gt;&lt;br /&gt;CERN which is the organization that runs the LHC project is using something called CernVM which is is custom Linux distribution. According to VMware, CernVM runs inside of VMware virtual machines that include PC and Macs across a grid that encompases the power of approximately 40,000 CPUs and some 15 petabytes of data a year.&lt;br /&gt;&lt;br /&gt;CERN itself is no stranger to Linux and is one of the lead backers of the Scientific Linux distribution, which is a recompiled version of Red Hat Enterprise Linux.&lt;br /&gt;&lt;br /&gt;**UPDATED** Got a comment (listed below) from a commenter with an IP within CERN that writes,".. the primary configuration for machines in the LHC computing grid (http://lcg.web.cern.ch/LCG/) is based on Scientific Linux distribution running directly on the hardware. This grid is used to receive and distribute the 15PB of data across the 100,000s of CPUs across the world" **&lt;br /&gt;&lt;br /&gt;Considering that the LHC, according to some, could be powerful enough to destroy the Earth, create a blackhole or rip a hole in the fabric of space itself, it is somewhat re-assuring that at least some of the key software behind it is not at risk from the blue screen of death."&lt;/span&gt;</description>
      <guid>/</guid>
    </item>
    <item>
      <title>Usando o Authenticate do CakePHP</title>
      <link>http://www.blogdopedro.net/2008/09/10/usando-o-authenticate-do-cakephp</link>
      <description>&lt;img style="float:left;margin:0 10px 10px 0;" src="http://4.bp.blogspot.com/_gMGOvKSyf40/SMg_eFjtnBI/AAAAAAAAAEc/JqBjO-B8tPc/s400/cake-logo.png" border="0" /&gt;Estou trabalhando ultimamente com o &lt;a href="http://cakephp.org/"&gt;CakePHP &lt;/a&gt;(1.2) e achei um componente muito &#250;til: o &lt;a href="http://api.cakephp.org/class_auth_component.html"&gt;AuthComponent&lt;/a&gt;. Ele centraliza todo o fluxo de autentica&#231;&#227;o no sistema e se voc&#234; seguir algumas regras b&#225;sicas dele, poder&#225; fazer toda parte de login do seu site com praticamente esfor&#231;o zero.&lt;br /&gt;&lt;br /&gt;Primeiro passo &#233; definir se a maior parte do seu site ser&#225; publica ou privada por que isso dir&#225; onde voc&#234; deve acionar o Auth. Se voc&#234; notar que quase todas as &#225;reas do seu site ser&#225; de acesso publico, &#233; melhor chamar o Auth direto nos controllers que ter&#225; actions privadas. Caso n&#227;o, voc&#234; pode colocar direto no app_controller da sua aplica&#231;&#227;o.&lt;br /&gt;&lt;br /&gt;N&#227;o que voc&#234; n&#227;o possa colocar direto na configura&#231;&#227;o de chamada do auth a lista de controllers e/ou actions e suas respectivas visibilidades, mas &#233; s&#243; por uma quest&#227;o de economia de esfor&#231;o&lt;br /&gt;&lt;br /&gt;A id&#233;ia &#233; simples, e vou assumir que o controller com o auth ser&#225; o app_controller  &lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;class AppController extends Controller {&lt;br /&gt;&lt;br /&gt; var $components = array('Auth');&lt;br /&gt;&lt;br /&gt; function beforeFilter() {&lt;br /&gt;&lt;br /&gt;  // Auth config&lt;br /&gt;  $this-&amp;gt;Auth-&amp;gt;allow(array('action_publica'));&lt;br /&gt;  $this-&amp;gt;Auth-&amp;gt;loginError = __("Usuario nao encontrado", true);&lt;br /&gt;         $this-&amp;gt;Auth-&amp;gt;loginAction = array('controller' =&amp;gt; 'users', 'action' =&amp;gt; 'login');&lt;br /&gt;    $this-&amp;gt;Auth-&amp;gt;loginRedirect = array('controller' =&amp;gt; 'users', 'action' =&amp;gt; 'profile');&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;No exemplo acima, coloquei a chamada do componente no &lt;b&gt;var $components = array('Auth');&lt;/b&gt;, logo depois no beforeFilter ( que sempre &#233; executado antes do controller) configurei o Auth da seguinte forma: o allow() serve para voc&#234; dizer quais actions s&#227;o de acesso publico, o loginError() &#233; a mensagem de erro, o loginAction() define onde esta o action de login e o loginRedirect() serve pra apontar pra onde o usu&#225;rio ser&#225; redirecionado ap&#243;s o login. Agora basta no meu controller login colocar as actions login() e logout() que ficaria parecido com o seguinte:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;class UsersController extends AppController {&lt;br /&gt;&lt;br /&gt;   function login() { }&lt;br /&gt;&lt;br /&gt;  function logout() {&lt;br /&gt;     $this-&amp;gt;redirect($this-&amp;gt;Auth-&amp;gt;logout());&lt;br /&gt;   } &lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Assim ficar o login e o logout. Simples n&#227;o ? O action login() pode ficar completamente em branco e o logout() faz um redirect pro logout do Auth. E a view do login tamb&#233;m &#233; bem simples:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&amp;lt;div class="users"&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;?php if ($session-&amp;gt;check('Message.auth')):?&amp;gt;&lt;br /&gt;        &amp;lt;?php $session-&amp;gt;flash('auth'); ?&amp;gt;&lt;br /&gt;&amp;lt;?php endif;?&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;?php echo $form-&amp;gt;create('User', array('action' =&amp;gt; 'login'));?&amp;gt;&lt;br /&gt; &amp;lt;fieldset&amp;gt;&lt;br /&gt;   &amp;lt;legend&amp;gt;&amp;lt;? __('Login') ?&amp;gt;&amp;lt;/legend&amp;gt;&lt;br /&gt;  &amp;lt;?= $form-&amp;gt;input('username'); ?&amp;gt;&lt;br /&gt;  &amp;lt;?= $form-&amp;gt;input('password'); ?&amp;gt;&lt;br /&gt; &amp;lt;/fieldset&amp;gt; &lt;br /&gt;&amp;lt;?php echo $form-&amp;gt;end('Logar');?&amp;gt;&lt;br /&gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Na view eu coloquei o &lt;b&gt;$session-&amp;gt;flash('auth'); &lt;/b&gt; principalmente para mostrar a mensagens do tipo "usu&#225;rio n&#227;o encontrado", que voc&#234; configura previamente no Auth.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Algumas considera&#231;&#245;es finais&lt;/h3&gt;&lt;br /&gt;&lt;br /&gt;O Auth tem v&#225;rias configura&#231;&#245;es que podem ser alteradas, mas por default ele assume que voc&#234; tem um modelo chamado &lt;b&gt;User&lt;/b&gt;, que tem dois campos: username e password. Ele tamb&#233;m assume que o campo password foi criptografado com um hash dele. A quest&#227;o da criptografia do password &#233; a &#250;nica coisa que n&#227;o pode ser alterada - ele sempre assume que o password esta criptografado.&lt;br /&gt;&lt;br /&gt;Para saber mais sobre o Auth, v&#225; na p&#225;gina da &lt;a href="http://api.cakephp.org/class_auth_component.html"&gt;API&lt;/a&gt; dele e da &lt;a href="http://book.cakephp.org/view/172/Authentication"&gt;documenta&#231;&#227;o no CookBook&lt;/a&gt;. Agora vou continuar estudando sobre o ACL para definir as permiss&#245;es de usu&#225;rio automaticamente pelo grupo que ele pertence. Quando estiver com melhores conhecimentos tento escrever algo sobre isso.</description>
      <guid>/</guid>
    </item>
    <item>
      <title>Alterando configura&#231;&#245;es do php.ini via apache</title>
      <link>http://www.blogdopedro.net/2008/09/09/alterando-configuracoes-do-phpini-via-apache</link>
      <description>&lt;img style="float:left;margin:0 10px 10px 0;" src="http://4.bp.blogspot.com/_gMGOvKSyf40/SMWa8xTlQzI/AAAAAAAAAEU/FxCPyp2Np4A/s400/exec.png" border="0" /&gt;Pra quem trabalha com v&#225;rios projetos PHP em um mesmo servidor, sabe que ficar alterando o PHP.INI para cada besteira que algum projeto queria fazer n&#227;o &#233; uma coisa muito legal. Para falar a verdade n&#227;o &#233; nada legal... Por exemplo, n&#227;o &#233; legal trocar a pasta tempor&#225;ria de upload para um diret&#243;rio que n&#227;o possui permiss&#227;o de escrita ou que esta em uma parti&#231;&#227;o com pouco espa&#231;o dispon&#237;vel.&lt;br /&gt;&lt;br /&gt;Entretanto ficar confiando no ini_set() do PHP realmente n&#227;o &#233; legal, pois ao meu ver ca&#237;mos em dois problemas: as configura&#231;&#245;es do php.ini ficam extremamente espalhadas ( n&#227;o queremos violar o &lt;a href="http://en.wikipedia.org/wiki/Don't_repeat_yourself"&gt;DRY&lt;/a&gt; correto ?), e segundo &#233; que n&#227;o podemos fazer tudo com as fun&#231;&#245;es ini_set() like.&lt;br /&gt;&lt;br /&gt;Para quem n&#227;o sabe, algumas configura&#231;&#245;es do php.ini n&#227;o pode ser alteradas "on the fly". A Zend criou um n&#237;vel de seguran&#231;a chamado PHP_INI_SYSTEM, que n&#227;o podem ser alteradas em runtime ( &lt;a href="http://www.php.net/manual/en/ini.php"&gt;clique aqui&lt;/a&gt; para ver a lista de fun&#231;&#245;es e privil&#233;gios necess&#225;rios).&lt;br /&gt;&lt;br /&gt;A solu&#231;&#227;o que encontrei foi simples mas eficaz ( al&#233;m de seguir as orienta&#231;&#245;es da pr&#243;pria Zend) : usar uma diretiva de diret&#243;rio do Apache, lan&#231;ando um PHP Admin Value. Fazendo isso voc&#234; pode redefinir algum par&#226;metro do php.ini para um diret&#243;rio espec&#237;fico no servidor. A id&#233;ia &#233; mais ou menos a seguinte: No httpd.conf do apache, dentro da sess&#227;o &lt;a href="http://httpd.apache.org/docs/2.0/mod/core.html#ifmodule"&gt;Ifmodule &lt;/a&gt;, crie um diret&#243;rio para sua aplica&#231;&#227;o e coloque o seguinte par&#226;metro:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;    &amp;lt;Directory "/caminho/para/o/projeto/"&amp;gt;&lt;br /&gt;        php_admin_value parametro_do_php_ini "novo_valor"&lt;br /&gt;    &amp;lt;/Directory&amp;gt;&lt;br /&gt;&lt;/code&gt;Com isso voc&#234; pode sobrescrever o comportamento do php.ini inclusive em configura&#231;&#245;es mais avan&#231;adas. Sei que &#233; redundante, mas como se pode perceber tive que usar o php como m&#243;dulo para poder proveitar essa diretiva.</description>
      <guid>/</guid>
    </item>
    <item>
      <title>Gerenciamento de campanhas via OpenX</title>
      <link>http://www.blogdopedro.net/2008/09/05/gerenciamento-de-campanhas-via-openx</link>
      <description>&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.openx.org"&gt;&lt;img style="float:left;cursor:hand;margin:0 10px 10px 0;" src="http://1.bp.blogspot.com/_gMGOvKSyf40/SMGCJHihfEI/AAAAAAAAAEM/QL8r0VS27lU/s400/logo_openx.png" border="0" /&gt;&lt;/a&gt;Vejo pouca gente comentando sobre uma ferramenta de gerenciamento de publicidade online muito interessante feita na dupla PHP &amp;amp; MySQL: OpenX.&lt;br /&gt;&lt;br /&gt;O OpenX &#233; uma ferramenta j&#225; est&#225;vel usada para o gerenciamento de banners e texto publicit&#225;rios de N anunciantes (advertisers) para N publicadores (publishers) no esquema de campaigns. No in&#237;cio &#233; meio complexo entender como funciona as campaigns, zones, filters e os esquemas de clicks, mas n&#227;o &#233; nenhum &lt;a href="http://pt.wikipedia.org/wiki/Ciclope"&gt;ciplope&lt;/a&gt;. Eu estive futucando o design do software e os caras que desenvolveram focaram muito (muito mesmo) em desempenho - o que &#224;s vezes n&#227;o os deixam seguir algumas regras da cartilha do "bom desenvolvedor", mas nada alarmante.&lt;br /&gt;&lt;br /&gt;Outra coisa muito legal &#233; os diversos relat&#243;rios que ele gera, al&#233;m de um instalador que torna a vida mais f&#225;cil para o primeiro deployment.&lt;br /&gt;&lt;br /&gt;Para saber mais sobre a ferramenta, &lt;a href="http://www.openx.org/pt"&gt;clique aqui&lt;/a&gt;. &lt;br /&gt;&lt;br /&gt;</description>
      <guid>/</guid>
    </item>
    <item>
      <title>Slide sobre Usabilidade</title>
      <link>http://www.blogdopedro.net/2008/08/29/slide-sobre-usabilidade</link>
      <description>Recebi pelo twitter o link do slide abaixo e achei interessante a forma como ele fala sobre usabilidade, usando o Wordpress e algumas outras ferramentas que conhecemos como refer&#234;ncia. Expressa bem a id&#233;ia do Getting Real sobre fazer somente o necess&#225;rio e deixar claro como ele funciona.

&lt;div align="center"&gt;&lt;div style="width:425px" id="__ss_89124"&gt;&lt;strong style="display:block;margin:12px 0 4px"&gt;&lt;a href="http://www.slideshare.net/edanzico/how-not-to-get-noticed" title="How Not To Get Noticed"&gt;How Not To Get Noticed&lt;/a&gt;&lt;/strong&gt;&lt;object width="425" height="355"&gt;&lt;param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=how-not-to-get-noticed4368&amp;stripped_title=how-not-to-get-noticed" /&gt;&lt;param name="allowFullScreen" value="true"/&gt;&lt;param name="allowScriptAccess" value="always"/&gt;&lt;embed src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=how-not-to-get-noticed4368&amp;stripped_title=how-not-to-get-noticed" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div style="padding:5px 0 12px"&gt;View more &lt;a href="http://www.slideshare.net/"&gt;presentations&lt;/a&gt; from &lt;a href="http://www.slideshare.net/edanzico"&gt;Liz Danzico&lt;/a&gt;.&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</description>
      <guid>/</guid>
    </item>
    <item>
      <title>Tracer Bullet</title>
      <link>http://www.blogdopedro.net/2008/08/28/tracer-bullet</link>
      <description>Uma dica simples, mas que &#233; capaz de nos livrar de muitas dores-de-cabe&#231;a &#233; o uso de c&#243;digos testadores de ambiente, ou como o livro &lt;a href="http://www.blogdopedro.net/2008/08/dica-pragmatic-programmer.html"&gt;Pragmatic Programmer&lt;/a&gt; chama, &lt;a href="http://en.wikipedia.org/wiki/Tracer_ammunition"&gt;Tracer Bullet&lt;/a&gt;. Se preocupar com o ambiente em que sua aplica&#231;&#227;o ir&#225; rodar &#233; t&#227;o importante quanto escolher a framework certa para desenvolv&#234;-la. Precisamos ter certeza sobre quais s&#227;os os m&#243;dulos suportados pelos servidores envolvidos, diret&#243;rios com permiss&#227;o de escrita, configura&#231;&#245;es diversas do web server e outros itens que sempre nos preocupamos por &#250;ltimo.&lt;br /&gt;&lt;br /&gt;Deixar para testar o ambiente de produ&#231;&#227;o com o software que ir&#225; ser entregue (ainda que seja a vers&#227;o alpha) &#233; t&#227;o insensato quanto fazer o checkup do seu carro 30 min antes de viajar do Rio para Bahia com toda a fam&#237;lia. Se tiver que alterar qualquer coisa, j&#225; era.&lt;br /&gt;&lt;br /&gt;Tendo esse problema nas m&#227;os, entende-se ent&#227;o a t&#233;cnica de Tracer Bullet, onde criamos um pequeno c&#243;digo, com o m&#237;nimo de linhas necess&#225;rias para fazer um teste geral no ambiente. Por exemplo, em uma aplica&#231;&#227;o qualquer pode-se testar a conex&#227;o em um CRUD simples com as bases de dados que ser&#227;o usadas, o uso de componentes terceirizados, envio de emails, permiss&#245;es de diret&#243;rios e usu&#225;rios, extens&#245;es do web server ou qualquer outro recurso que sua aplica&#231;&#227;o final poder&#225; usar. N&#227;o gaste tempo tentando fazer uma tela bonitinha pra mostrar pro cliente, a fun&#231;&#227;o do Tracer Bullet &#233; informar pra equipe de desenvolvimento e infra o que ter&#225; que ser alterado antes do primeiro deployment. E como grande parte da infra ser&#225; testada de forma direta, isso refletir&#225; na redu&#231;&#227;o de testes posteriores ao primeiro processo de deployment.</description>
      <guid>/</guid>
    </item>
    <item>
      <title>Dica: The Pragmatic Programmer</title>
      <link>http://www.blogdopedro.net/2008/08/26/dica-the-pragmatic-programmer</link>
      <description>&lt;a href="http://www.livrariacultura.com.br/scripts/cultura/externo/index.asp?id_link=5378&amp;amp;tipo=2&amp;amp;isbn=020161622X" target="_blank"&gt;&lt;img style="display:block;text-align:center;margin:0 auto 10px;" src="http://1.bp.blogspot.com/_gMGOvKSyf40/SLMfb3aAq2I/AAAAAAAAADc/49CfhaLY5NI/s400/cover-PragmaticProg.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Vou usar o blog para indicar alguns livros interessantes que tenho tido contato. Embora pare&#231;a ser puro "jab&#225;", a id&#233;ia &#233; passar pra voc&#234;s o que tenho lido e que tem trazido benef&#237;cios reais no meu dia-a-dia.&lt;br /&gt;&lt;br /&gt;Embora n&#227;o tenha terminado de ler, tenho gostado &lt;b&gt; muito &lt;/b&gt; do The Pragmatic Programmer. &#201; um livro obrigat&#243;rio, servindo de introdu&#231;&#227;o geral para Refatora&#231;&#227;o, Source Control, TDD, t&#233;cnicas DRY, e v&#225;rios outros recursos que est&#227;o de uma forma ou de outra, englobados dentro dos processos &#225;geis de desenvolvimento.&lt;br /&gt;&lt;br /&gt;Al&#233;m de n&#227;o ter uma linguagem chata e usar v&#225;rias analogias interessantes, o livro &#233; realmente pr&#225;tico, traz muitas situa&#231;&#245;es que facilmente encontramos no dia-a-dia.</description>
      <guid>/</guid>
    </item>
    <item>
      <title>PHP para aplica&#231;&#245;es Enterprise</title>
      <link>http://www.blogdopedro.net/2008/08/25/php-para-aplicacoes-enterprise</link>
      <description>Esta discurs&#227;o &#233; antiga, mas foi bem explanada por Ivo Jansch na PHP London Conference 2008. O PHP tem recursos interessantes para o desenvolvimento de aplica&#231;&#245;es Enterprise, mas  parece  que  a comunidade aqui no Brasil n&#227;o acordou para isso. Fica a dica de usar os t&#243;picos explanados na apresenta&#231;&#227;o para nortear os estudos!

&lt;div align="center"&gt;&lt;div style="width:425px" id="__ss_288851"&gt;&lt;strong style="display:block;margin:12px 0 4px"&gt;&lt;a href="http://www.slideshare.net/ijansch/enterprise-php-288851" title="Enterprise PHP (PHP London Conference 2008)"&gt;Enterprise PHP (PHP London Conference 2008)&lt;/a&gt;&lt;/strong&gt;&lt;object width="425" height="355"&gt;&lt;param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=enterprise-php-1204462261930487-3&amp;stripped_title=enterprise-php-288851" /&gt;&lt;param name="allowFullScreen" value="true"/&gt;&lt;param name="allowScriptAccess" value="always"/&gt;&lt;embed src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=enterprise-php-1204462261930487-3&amp;stripped_title=enterprise-php-288851" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div style="padding:5px 0 12px"&gt;View more &lt;a href="http://www.slideshare.net/"&gt;presentations&lt;/a&gt; from &lt;a href="http://www.slideshare.net/ijansch"&gt;Ivo Jansch&lt;/a&gt;.&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</description>
      <guid>/</guid>
    </item>
    <item>
      <title>Usando abas no VIM</title>
      <link>http://www.blogdopedro.net/2008/08/21/usando-abas-no-vim</link>
      <description>&lt;img style="float:left;margin:0 10px 10px 0;" src="http://2.bp.blogspot.com/_gMGOvKSyf40/SK2KU8YD80I/AAAAAAAAADE/w5FmlQ0Vk1M/s400/app-thumbnail.png" border="0" /&gt;Gosto de usar o VIM no dia-a-dia e encontrei um recurso muito &#250;til dispon&#237;vel a partir da vers&#227;o 7 deste &lt;s&gt;super&lt;/s&gt; editor: abas!&lt;br /&gt;&lt;br /&gt;Basta usar o &lt;b&gt;:tabnew&lt;/b&gt; para abrir uma nova aba. Voc&#234; pode opcionalmente fornecer o arquivo que deseja abrir na nova aba, passando o caminho como par&#226;metro.&lt;br /&gt;&lt;br /&gt;Para navegar entre as abas, basta usar o &lt;b&gt;:tabn &lt;i&gt;n&lt;/i&gt;&lt;/b&gt;, onde &lt;b&gt;&lt;i&gt;n&lt;/i&gt;&lt;/b&gt; &#233; a posi&#231;&#227;o da aba, come&#231;ando do 0. Para avan&#231;ar ou voltar entre as abas, use o &lt;b&gt;:tabnext&lt;/b&gt; e o &lt;b&gt;:tabprev&lt;/b&gt;. Existe tamb&#233;m o &lt;b&gt;:tabfirst&lt;/b&gt; e &lt;b&gt;:tablast&lt;/b&gt;, que respectivamente avan&#231;am para a primeira ou &#250;ltima aba.</description>
      <guid>/</guid>
    </item>
    <item>
      <title>Mate processos no Windows &#224; la Unix</title>
      <link>http://www.blogdopedro.net/2008/08/20/mate-processos-no-windows-a-la-unix</link>
      <description>Sempre tenha o &lt;b&gt;tasklist&lt;/b&gt; e o &lt;b&gt;taskkill&lt;/b&gt; a m&#227;o. O primeiro voc&#234; usar&#225; para pegar os processos abertos e seus PIDs, e com o segundo, voc&#234; mata o processo.&lt;br /&gt;&lt;br /&gt;Um exemplo pr&#225;tico:
&lt;pre class="code"&gt;C:\Documents and Settings\pmendes\Desktop&amp;gt;tasklist&lt;br /&gt;&lt;br /&gt;Image Name                   PID Session Name     Session#    Mem Usage&lt;br /&gt;========================= ====== ================ ======== ============&lt;br /&gt;System Idle Process            0 Console                 0         28 K&lt;br /&gt;System                         4 Console                 0        304 K&lt;br /&gt;smss.exe                     648 Console                 0        392 K&lt;br /&gt;csrss.exe                    712 Console                 0      4.424 K&lt;br /&gt;winlogon.exe                 736 Console                 0      1.788 K&lt;br /&gt;services.exe                 808 Console                 0      3.464 K&lt;br /&gt;lsass.exe                    820 Console                 0      1.828 K&lt;br /&gt;svchost.exe                 1012 Console                 0      4.840 K&lt;br /&gt;svchost.exe                 1080 Console                 0      4.360 K&lt;br /&gt;svchost.exe                 1168 Console                 0     35.352 K&lt;br /&gt;svchost.exe                 1276 Console                 0      3.636 K&lt;br /&gt;svchost.exe                 1412 Console                 0      4.732 K&lt;br /&gt;spoolsv.exe                 1568 Console                 0      5.284 K&lt;br /&gt;apache.exe                  1760 Console                 0     21.632 K&lt;br /&gt;avgwdsvc.exe                1812 Console                 0      2.888 K&lt;br /&gt;mDNSResponder.exe           1828 Console                 0      2.836 K&lt;br /&gt;mysqld-nt.exe               1976 Console                 0      5.792 K&lt;br /&gt;NMSAccessU.exe              2020 Console                 0      1.828 K&lt;br /&gt;svchost.exe                  248 Console                 0      4.172 K&lt;br /&gt;apache.exe                  2000 Console                 0     31.460 K&lt;br /&gt;avgrsx.exe                  5276 Console                 0     40.048 K&lt;br /&gt;alg.exe                     5676 Console                 0      3.588 K&lt;br /&gt;explorer.exe                6664 Console                 0     34.880 K&lt;br /&gt;ctfmon.exe                  7192 Console                 0      3.272 K&lt;br /&gt;jusched.exe                 7244 Console                 0      6.148 K&lt;br /&gt;avgtray.exe                 7580 Console                 0      6.180 K&lt;br /&gt;Babylon.exe                 8152 Console                 0     21.432 K&lt;br /&gt;xampp-control.exe           5308 Console                 0      3.332 K&lt;br /&gt;jucheck.exe                 7564 Console                 0      6.492 K&lt;br /&gt;firefox.exe                 7912 Console                 0    187.140 K&lt;br /&gt;eclipse.exe                 6512 Console                 0    107.316 K&lt;br /&gt;DAP.exe                     6768 Console                 0      5.032 K&lt;br /&gt;pidgin.exe                  6296 Console                 0      5.332 K&lt;br /&gt;cmd.exe                     8036 Console                 0      2.732 K&lt;br /&gt;wmiprvse.exe                6788 Console                 0      6.044 K&lt;br /&gt;tasklist.exe                6272 Console                 0      4.516 K&lt;/pre&gt;&lt;br /&gt;Supondo que eu queira matar o Eclipse, a ideia seria a seguinte:
&lt;pre class="code"&gt;C:\Documents and Settings\pmendes\Desktop&amp;gt;taskkill /PID 6512&lt;br /&gt;SUCCESS: The process with PID 6512 has been terminated.&lt;/pre&gt;
A id&#233;ia &#233; simples. Claro que o kill do Unix &#233; mais flex&#237;vel, mas sejamos mais modestos. No taskkill voc&#234; tamb&#233;m tem o par&#226;metro &lt;b&gt;-f&lt;/b&gt; para for&#231;ar o termino do processo e tamb&#233;m pode matar o processo pelo nome.&lt;br /&gt;&lt;br /&gt;J&#225; tive vezes que o taskkill disse que o processo morreu mais o processo tava mas pra Highlander do que pra Gasparzinho. Vai entender. N&#227;o sei tamb&#233;m como o taskkill funciona com as &#225;rvores de processos. Quem tiver algo mais a compartilhar, sinta-se a vontade.&lt;br /&gt;&lt;br /&gt;Eu n&#227;o vou nem dizer que na universidade eu consegui matar um software de controle de usu&#225;rio pelo console usando essa dupla t&#227;o simp&#225;tica, at&#233; porque seria um estimulo a desordem na institui&#231;&#227;o.</description>
      <guid>/</guid>
    </item>
    <item>
      <title>Aspect Oriented Programming e PHP</title>
      <link>http://www.blogdopedro.net/2008/08/19/aspect-oriented-programming-e-php</link>
      <description>Chegando com mais um slide do &lt;a href="http://sebastian-bergmann.de/"&gt;Sebastian Bergman&lt;/a&gt;, o criado do PHPUnit, desta vez o rapaz d&#225; uma pequena palinha sobre &lt;a href="http://en.wikipedia.org/wiki/Aspect-oriented_programming"&gt;AOP&lt;/a&gt;, que &#233; uma t&#233;cnica complementar a OOP.

&lt;div align="center"&gt;&lt;div style="width:425px" id="__ss_546116"&gt;&lt;strong style="display:block;margin:12px 0 4px"&gt;&lt;a href="http://www.slideshare.net/sebastian_bergmann/the-state-of-aop-for-php" title="The State of AOP for PHP"&gt;The State of AOP for PHP&lt;/a&gt;&lt;/strong&gt;&lt;object width="425" height="355"&gt;&lt;param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=the-state-of-aop-for-php-4969&amp;stripped_title=the-state-of-aop-for-php" /&gt;&lt;param name="allowFullScreen" value="true"/&gt;&lt;param name="allowScriptAccess" value="always"/&gt;&lt;embed src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=the-state-of-aop-for-php-4969&amp;stripped_title=the-state-of-aop-for-php" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div style="padding:5px 0 12px"&gt;View more &lt;a href="http://www.slideshare.net/"&gt;presentations&lt;/a&gt; from &lt;a href="http://www.slideshare.net/sebastian_bergmann"&gt;Sebastian Bergmann&lt;/a&gt;.&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</description>
      <guid>/</guid>
    </item>
    <item>
      <title>Code Igniter - Code Generator</title>
      <link>http://www.blogdopedro.net/2008/08/15/code-igniter-code-generator</link>
      <description>Tenho estudado ultimamente sobre o &lt;a href="http://www.cakephp.org/"&gt;CakePHP&lt;/a&gt; e de cara j&#225; encontrei uma ferramenta muito &#250;til, o &lt;b&gt;bake&lt;/b&gt; que &#233; um PHP CLI que permite desde a cria&#231;&#227;o do projeto a scripts de forma automatica. A id&#233;ia &#233; at&#233; simples, mas na pr&#225;tica ajuda a acelerar o processo de desenvolvimento e manter organizado.&lt;br /&gt;&lt;br /&gt;Como conhe&#231;o o Code Igniter faz um tempo e sei que ele n&#227;o tem oficialmente uma ferramenta parecida, procurei na internet e achei algo &lt;s&gt;que nem se compara&lt;/s&gt; criado por um Brazuca. N&#227;o &#233; uma ferramenta "formal" e pelo visto nem pretende ser um grande projeto, mas j&#225; d&#225; alguma facilidade. A p&#225;gina da ferramenta &#233; &lt;a href="http://www.screencaster.com.br/script-igniter-time-saving-para-criacao-de-aplicacoes-code-igniter/"&gt;essa&lt;/a&gt;. S&#243; roda em ambientes *nix.</description>
      <guid>/</guid>
    </item>
    <item>
      <title>PDO - Conceitos Fundamentais</title>
      <link>http://www.blogdopedro.net/2008/08/15/pdo-conceitos-fundamentais</link>
      <description>Com a chegada da quinta vers&#227;o do PHP (na verdade na 5.1), nasceu uma poderosa ferramenta que ainda hoje pouca gente j&#225; parou pra estudar: o PHP Data Objects ou PDO. &lt;br /&gt;&lt;br /&gt;Pra inicio de conversa, o PDO &#233; uma camada de acesso a dados que como o &lt;a href="http://www.php.net"&gt;php.net&lt;/a&gt; promete, "indiferente do banco de dados que esteja usando, voc&#234; poder&#225; usar as mesmas fun&#231;&#245;es para executar queries ou pegar dados". Desenvolvida pelo Wez Furlong - um desenvolvedor do core PHP que at&#233; tenho na minha lista de links no lado esquerdo, o PDO realmente cumpre o que promete em unificar as interfaces de acesso a dados. Ele foi escrito em C e segundo alguns evangelistas da extens&#227;o, n&#227;o perde em nada em desempenho para as extens&#245;es tradicionais.&lt;br /&gt;&lt;br /&gt;Ainda hoje temos a op&#231;&#227;o de usar no PHP os antigos drivers especificos para cada DB, mas isso j&#225; tem ca&#237;do em desuso. Vale repetir o que a Zend comentou, que o PDO n&#227;o &#233; uma abstra&#231;&#227;o do que j&#225; tinha, ele &#233; a reescrita dos drivers fornecendo uma mesma interface (na maioria das vezes) para o desenvolvedor. Pra quem usa o Pear (se voc&#234; n&#227;o conhece deveria) talvez j&#225; tenha se esbarrado no PearDB, que esta sim &#233; uma abstra&#231;&#227;o. Mas o PDO n&#227;o.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt; Composi&#231;&#227;o e Bases Suportadas &lt;/h3&gt;&lt;br /&gt;&lt;br /&gt;O PHP Data Objects suporta nativamente as seguintes extens&#245;es: PostgreSQL, MySQL (3,4,5), Firebird, Sybase, Informix, Oracle, ODBC, DBLIB, IBM DB2, SQLite (2,3), MSSQL e FreeTDS. &lt;br /&gt;&lt;br /&gt;Para usar o PDO voc&#234; ter&#225; que ter no m&#237;nimo duas extens&#245;es : a do core, que geralmente j&#225; vem instalada por default, e a do banco desejado, como por exemplo o pdo_mysql.&lt;br /&gt;&lt;br /&gt;O forma mais f&#225;cil para instalar os PDO drivers em uma vers&#227;o do PHP previamente instalado &#233; atrav&#233;s do &lt;a href="http://pecl.php.net/"&gt;PHP Extension Comunity Library&lt;/a&gt;. Uma vez tendo o PECL instalado, basta digitar &lt;b&gt;pecl install &amp;lt;nome_do_driver&amp;gt;&lt;/b&gt; e depois atualizar o php.ini adicionando na parte de extens&#245;es o driver instalado.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt; Conectando ao bd &lt;/h3&gt;&lt;br /&gt;&lt;br /&gt;Vou comentar s&#243; sobre como conectar ao banco de dados e criar um handle para a conex&#227;o, pois basicamente &#233; isso que difere de um bd para o outro - ao final, vou deixar alguns links com melhores exemplos.&lt;br /&gt;&lt;br /&gt;&lt;code&gt;// Criando o handle de uma conex&#227;o com o PostgreSQL&lt;br /&gt;$db = new PDO("pgsql:dbname=MEU_DB;host=localhost", "USUARIO", "SENHA" );&lt;br /&gt; &lt;br /&gt;// Criando o handle de uma conex&#227;o com o MySQL&lt;br /&gt;$db = new PDO("mysql:dbname=MEU_DB;host=localhost", "USUARIO", "SENHA" );&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Viu como &#233; simples? E com os outros drivers o procedimento &#233; bem parecido. Vale ressaltar que por dicas da pr&#243;pria Zend, que o processo de cria&#231;&#227;o de um handle sempre deve estar dentro de um try/catch, para que informa&#231;&#245;es do servidor n&#227;o sejam lan&#231;adas para o usu&#225;rio. Fique atento!&lt;br /&gt;&lt;br /&gt;Para dar um close na conex&#227;o basta voc&#234; atribuir qualquer valor ao handle, como null por exemplo. &lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Conclus&#227;o&lt;/h3&gt;&lt;br /&gt;&lt;br /&gt;O PDO veio para substituir de vez as antigas formas de acesso a dados no PHP. Existe um n&#250;mero generoso de artigos sobre essa ferramenta, e para n&#227;o ficar recriando a roda, deixo abaixo alguns links interessantes de fontes que j&#225; publicaram algumas receitas de bolo:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://br.php.net/manual/pt_BR/book.pdo.php"&gt;Manual Oficial em Portugu&#234;s&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.devshed.com/c/a/PHP/Using-PDO-Objects-in-PHP-5/"&gt;DevShed - Using PDO Objects in PHP5&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.blogdopedro.net/2008/07/php-pdo.html"&gt;Post anterior com slides do criador do PDO&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.htmlstaff.org/ver.php?id=9733"&gt;HTMLStaff - PDO: Bancos de dados no PHP 5&lt;/a&gt;</description>
      <guid>/</guid>
    </item>
    <item>
      <title>Things to do...</title>
      <link>http://www.blogdopedro.net/2008/07/29/things-to-do</link>
      <description>Aproveitando um gancho no blog do &lt;a href="http://gc.blog.br"&gt;Guilherme Chapiewski&lt;/a&gt;, dei "ctrl+v ctrl+c" em um trecho do livro &lt;a href="http://www.amazon.com/Pragmatic-Programmer-Journeyman-Master/dp/020161622X/ref=pd_bbs_sr_1?ie=UTF8&amp;amp;s=books&amp;amp;qid=1207921851&amp;amp;sr=8-1"&gt;"The Pragmatic Programmer"&lt;/a&gt; que ele publicou:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;b&gt; Learn at least one new language every year. &lt;/b&gt;&lt;br /&gt;Different languages solve the same problems in different ways. By learning several different approaches, you can help broaden your thinking and avoid getting stuck in a rut. Additionally, learning many languages is far easier now, thanks to the wealth of freely available software on the Internet. &lt;br /&gt;&lt;br /&gt;&lt;b&gt; Read a technical book each quarter. &lt;/b&gt;&lt;br /&gt;Bookstores are full of technical books on interesting topics related to your current project. Once you&#8217;re in the habit, read a book a month. After you&#8217;ve mastered the technologies you&#8217;re currently using, branch out and study some that don&#8217;t relate to your project. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;Read nontechnical books, too.&lt;/b&gt;&lt;br /&gt;It is important to remember that computers are used by people&#8212;people whose needs you are trying to satisfy. Don&#8217;t forget the human side of the equation. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;Take classes.&lt;/b&gt; &lt;br /&gt;Look for interesting courses at your local community college or university, or perhaps at the next trade show that comes to town. &lt;br /&gt;Participate in local user groups. Don&#8217;t just go and listen, but actively participate. Isolation can be deadly to your career; find out what people are working on outside of your company. &lt;br /&gt;&lt;br /&gt;&lt;b&gt; Experiment with different environments. &lt;/b&gt;&lt;br /&gt;If you&#8217;ve worked only in Windows, play with Unix at home (the freely available Linux is perfect for this). If you&#8217;ve used only makefiles and an editor, try an IDE, and vice versa. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;Stay current.&lt;/b&gt;&lt;br /&gt;Subscribe to trade magazines and other journals (see page 262 for recommendations). Choose some that cover technology different from that of your current project. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;Get wired.&lt;/b&gt; Want to know the ins and outs of a new language or other technology? Newsgroups are a great way to find out what experiences other people are having with it, the particular jargon they use, and so on. Surf the Web for papers, commercial sites, and any other sources of information you can find. &lt;br /&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;As recomenda&#231;&#245;es acima parecem &#243;bvias, mas at&#233; mesmo o &#243;bvio precisa ser definido para ser bem seguido. A fila tem que andar...</description>
      <guid>/</guid>
    </item>
    <item>
      <title>PHP 5.3 e seu Garbage Collector</title>
      <link>http://www.blogdopedro.net/2008/07/28/php-53-e-seu-garbage-collector</link>
      <description>O PHP tem(ou tinha) um pequeno problema para tratar refer&#234;ncias  circulares, principalmente entre objetos. No blog do  &lt;a href="http://www.alexatnet.com/node/73"&gt;Alex Netkachov&lt;/a&gt;, um ZCE desconhecido da vida que as vezes posta umas coisas legais, ele fez o seguinte benchmark :
&lt;pre class="code"&gt;&lt;br /&gt;class Node {&lt;br /&gt; public $parentNode;&lt;br /&gt; public $childNodes = array();&lt;br /&gt; function Node() {&lt;br /&gt;  $this-&amp;gt;nodeValue = str_repeat('0123456789', 128);&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;function createRelationship() {&lt;br /&gt; $parent = new Node();&lt;br /&gt; $child = new Node();&lt;br /&gt; $parent-&amp;gt;childNodes[] = $child;&lt;br /&gt; $child-&amp;gt;parentNode = $parent;&lt;br /&gt;}&lt;br /&gt;echo 'Initial: ' . number_format(memory_get_usage(), 0, '.', ',') . &lt;br /&gt;" bytes\n";&lt;br /&gt;for($i = 0; $i &amp;lt; 10000; $i++) {&lt;br /&gt; createRelationship();&lt;br /&gt;}&lt;br /&gt;echo 'Peak: ' . number_format(memory_get_peak_usage(), 0, '.', ',') . &lt;br /&gt;" bytes\n";&lt;br /&gt;echo 'End: ' . number_format(memory_get_usage(), 0, '.', ',') . &lt;br /&gt;" bytes\n";&lt;br /&gt;&lt;/pre&gt;
E o output disso foi:&lt;br /&gt;&lt;code&gt;Initial: 62,224 bytes&lt;br /&gt;Peak: 34,905,216 bytes&lt;br /&gt;End: 34,905,016 bytes&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;p&gt;Muito interessante o resultado n&#227;o ? 34mb para 10.000 requisi&#231;&#245;es. Segundo o pr&#243;prio Alex, isso seria o equivalente a "Modern systems with 1-2Gb can run 30-60 similar processes at the same time. But in shared hosting environment or when support of 100 simultaneous connections is a system requirement, such memory consumption is inadequate." &lt;/p&gt;&lt;br /&gt;&lt;p&gt; Pois bem, um cientista da computa&#231;&#227;o de algum lugar do mundo chamado David Wang escreveu um patch para o garbage collector do PHP sanando este problema com as refer&#234;ncias circulares. Ele mesmo confessa que o PHP usa "a simple garbage collection system", precisando de alguns improvements. Ele publicou um resumo do de suas id&#233;ias relativas a este patch e ao problema em si no news.php.net, mas eu trago abaixo uma c&#243;pia da mensagem dele: &lt;/p&gt;
&lt;pre class="code"&gt;Hello, everyone. My name is David Wang and I am one of the students&lt;br /&gt;participating in Google Summer of Code this year. As you may remember,&lt;br /&gt;my project is to implement a garbage collector for circular references&lt;br /&gt;in PHP. As the midterm for Summer of Code is coming up, my mentor,&lt;br /&gt;Derick Rethans, thought it would be a good idea if I shared my&lt;br /&gt;progress with the community.&lt;br /&gt;&lt;br /&gt;As you know, PHP uses reference counting as a simple garbage&lt;br /&gt;collection system. One of the primary weaknesses of reference counting&lt;br /&gt;systems is that objects that refer indirectly or directly to&lt;br /&gt;themselves, i.e. reference cycles, are not collected. The accumulation&lt;br /&gt;of unreferenced memory that is only deallocated at the end of a&lt;br /&gt;request can be prohibitively expensive. The cycle collector I am&lt;br /&gt;implementing directly addresses this problem.&lt;br /&gt;&lt;br /&gt;The cycle collector is, of necessity, a type of tracing garbage&lt;br /&gt;collector. However, it uses reference count information to accelerate&lt;br /&gt;the collection process. Essentially, it works by removing the internal&lt;br /&gt;reference counts (that is, references from an object within the cycle&lt;br /&gt;to another object within the cycles )from candidate cycles. In a cycle&lt;br /&gt;that can be collected, after all internal reference counts have been&lt;br /&gt;removed, the reference count of all objects within the cycle should be&lt;br /&gt;0. The particular algorithm that I am using is the synchronous cycle&lt;br /&gt;collector described by David Bacon and V. T. Rajan in Concurrent Cycle&lt;br /&gt;Collection in Reference Counted Systems (see the article for further&lt;br /&gt;details). Various optimizations allow the cycle collector to be run&lt;br /&gt;relatively infrequently and execute speedily when it does run.&lt;br /&gt;&lt;br /&gt;Note that because PHP is designed to be single-threaded, a synchronous&lt;br /&gt;algorithm is used which does pause program execution for cycle&lt;br /&gt;collection when cycle collection becomes necessary. If a program has&lt;br /&gt;no reference cycles, the cycle collector does not run at all.&lt;br /&gt;&lt;br /&gt;The initial phase of implementation is complete, and I am currently&lt;br /&gt;profiling, optimizing and trying the modified version of PHP on&lt;br /&gt;various test programs in an effort to find bugs. Meanwhile, here are&lt;br /&gt;some recent benchmarks.&lt;br /&gt;&lt;br /&gt;Some aspects of the eZ Components (&lt;a href="http://ez.no/ezcomponents,"&gt;http://ez.no/ezcomponents,&lt;/a&gt;&lt;br /&gt;available from SVN with the instructions here:&lt;br /&gt;&lt;a href="http://ez.no/community/articles/an_introduction_to_ez_components/installation"&gt;http://ez.no/community/articles/an_introduction_to_ez_components/installation&lt;/a&gt;)&lt;br /&gt;testing suite use reference cycles heavily. The Template test uses&lt;br /&gt;circular references the most frequently, the Graph test also uses&lt;br /&gt;circular references, albeit less heavily.&lt;br /&gt;&lt;br /&gt;On the Graph test, maximum memory usage with unmodified PHP was 133.9&lt;br /&gt;MB with an execution time of 8 seconds.&lt;br /&gt;On the Graph test, maximum memory usage with gc was 51.6 MB with an&lt;br /&gt;execution time of 9 seconds.&lt;br /&gt;On the Template test, maxmium memory usage with unmodified PHP was 1.5&lt;br /&gt;GB with an execution time of 30 seconds.&lt;br /&gt;On the Template test, maxmium memory usage with gc was 67.3 MB with an&lt;br /&gt;execution time of 1 minute.&lt;br /&gt;On the whole suite of tests (which includes the Graph and Template&lt;br /&gt;tests), execution time with unmodified PHP was 12:03. With cycle&lt;br /&gt;collection, it was 12:43.&lt;br /&gt;These tests were conducted on my dual core AMD X2 4400+ desktop with&lt;br /&gt;./configure --with-gd --with-jpeg-dir --with-zlib. As you can see,&lt;br /&gt;there is the classic time vs. memory trade-off.&lt;br /&gt;&lt;br /&gt;My project is currently being hosted on the xdebug CVS. You can get&lt;br /&gt;the latest version with the following commands:&lt;br /&gt;&lt;br /&gt;cvs -d :pserver:srmread@cvs.xdebug.org:/repository login&lt;br /&gt;CVS password: srmread&lt;br /&gt;cvs -d :pserver:srmread@cvs.xdebug.org:/repository co circular&lt;br /&gt;Note that I'm implementing my project on top of a CVS version of PHP&lt;br /&gt;5.2 that is a couple of weeks old. However, the cycle collector can be&lt;br /&gt;ported into other versions of PHP fairly easily as it does not affect&lt;br /&gt;the existing Zend engine code too much.&lt;br /&gt;&lt;br /&gt;If anyone has any questions, I'll be more than happy to answer them!&lt;br /&gt;&lt;br /&gt;Regards,&lt;br /&gt;&lt;br /&gt;Yiduo (David) Wang&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;p&gt; Fico feliz por essa melhoria, pois &#233; uma pequena altera&#231;&#227;o que faz muita diferen&#231;a. S&#243; espero que n&#227;o tenha seus efeitos colaterais... &lt;/p&gt;</description>
      <guid>/</guid>
    </item>
    <item>
      <title>N&#227;o mude o escopo dos seus objetos</title>
      <link>http://www.blogdopedro.net/2008/07/22/nao-mude-o-escopo-dos-seus-objetos</link>
      <description>&lt;p&gt;Imaginemos a seguinte situa&#231;&#227;o : voc&#234; seguindo o modelo de classes criado para o projeto X, cria uma classe de usu&#225;rios. L&#225; voc&#234; tem todo o cuidado para definir os Gets e Sets, colocar seus atributos com seus devidos modificadores de acesso, cria todos os seus m&#233;todos e tudo fica perfeito, respeitando os mais elegantes padr&#245;es de programa&#231;&#227;o.  Logo ap&#243;s, voc&#234; usa essa classe para, por exemplo, fazer uma busca pelo usu&#225;rio de ID 7. Talvez a busca fique assim:&lt;/p&gt;$usuario = new User();&lt;br /&gt;&lt;p&gt;$usuario-&amp;gt;setId(7);&lt;/p&gt;$usuarioDesejado  = $usuario-&amp;gt;selectUser();&lt;br /&gt; &lt;br /&gt;&lt;p&gt;Ok, tudo ok. Mas.... e se de repente voc&#234; digita o nome do atributo de maneira errada, como por exemplo &lt;b&gt;seid&lt;/b&gt; .  O PHP vai retornar um erro, correto ? Errado. Ele n&#227;o retorna erro algum. Ele n&#227;o retorna nada. Na verdade, ele cria um atributo em tempo de execu&#231;&#227;o chamado, neste exemplo, &lt;b&gt;seid&lt;/b&gt;. Isso &#233; um problema.&lt;/p&gt;Claro que voc&#234;, assim como eu, s&#243; alteraria o escopo de um objeto em tempo de execu&#231;&#227;o por um enorme engano. Faria alguns testes, descobriria o erro e todos ficam felizes ( hipot&#233;ticamente ). Por&#233;m, existem alguns programadores que n&#227;o pensam assim. Pensam que se a linguagem permite, tem que usar. Logo, aproveitam a festa pra fazer uma zona com seu objeto. Come&#231;am a criar atributos alterando o design original da sua classe.&lt;br /&gt;&lt;p&gt;N&#227;o fa&#231;a isso. Em pouco tempo o projeto se tornar&#225; em uma bola de neve, onde n&#227;o se tem controle nenhum sobre o comportamento do seu c&#243;digo. Use a cabe&#231;a.&lt;/p&gt;Por hoje &#233; s&#243; pessoal.</description>
      <guid>/</guid>
    </item>
    <item>
      <title>Profissional sim, mas, aonde ?</title>
      <link>http://www.blogdopedro.net/2008/07/22/profissional-sim-mas-aonde</link>
      <description> Semana passada surgiu um debate aqui na &lt;a href="http://www.3jane.com/"&gt;&lt;span style="color:#0000ff;"&gt;&lt;u&gt;3Jane&lt;/u&gt;&lt;/span&gt;&lt;/a&gt; sobre um problema encontrado por muitas equipes quando se encontra um profissional 'super-star' . &lt;!--more--&gt;&lt;br /&gt;&lt;p style="margin-bottom:0;"&gt;Se voc&#234; esta acostumado a ler o blog do &lt;a href="http://blog.fragmental.com.br/"&gt;Phillip Cal&#231;ado&lt;/a&gt; j&#225; de ter deparado com o termo 'super-star', que &#233; como ele se refere aos programadores que dominam as ferramentas com que trabalham e por isso t&#234;m alguma visibilidade no mercado.&lt;/p&gt;&lt;br /&gt;&lt;p style="margin-bottom:0;"&gt; &#201; bem prov&#225;vel que alguns dos leitores deste blog trabalham ou j&#225;  trabalharam em equipes que tiveram a entrada de um super-star. Ae surge a pergunta: aonde voc&#234; &#233; um bom profissional ? Na empresa em que trabalhou ou no mercado, de uma forma mais ampla ?&lt;/p&gt;&lt;br /&gt;&lt;p style="margin-bottom:0;"&gt; Existem alguns profissionais que s&#227;o bons nas empresas 'incubadoras' onde eles foram formados. Dominavam todas as regras de neg&#243;cio, eram verdadeiros dbas-desenvolvedores-gerentes-selecionadores de curr&#237;culos  pl&#234;nos. Como o dono aqui da empresa costuma dizer, se  o cara for atropelado pelo caminh&#227;o do   leite a empresa tem que parar ( embora ele esque&#231;a que no Brasil n&#227;o temos caminh&#227;o do leite).&lt;/p&gt;&lt;br /&gt;&lt;p style="margin-bottom:0;"&gt; &#201; normal para qualquer um que j&#225; ocupou uma posi&#231;&#227;o desta ( muito comum em empresas pequenas ) se sentir deslocado ao mudar de empresa. Quando sa&#237; da antiga empresa onde trabalhava para vir para a 3Jane me senti assim tamb&#233;m. Mas o importante &#233; entedermos que quando estamos em uma empresa nova, estamos lidando com novas regras de neg&#243;cio, com novas pessoas ( e mentalidades ) e com provavelmente novas tecnologias.&lt;/p&gt;&lt;br /&gt;&lt;p style="margin-bottom:0;"&gt; N&#227;o &#233; incomum vermos alguns destes profissionais 'super-stars' tentando impor suas formas de trabalhar, criticando tudo e  colocando sempre suas formas de pensar e trabalhar como as ideias. Mas a coisa n&#227;o &#233; bem assim. Como o &lt;a href="http://www.dx7lab.com/"&gt;&lt;span style="color:#0000ff;"&gt;&lt;u&gt;Rafael DX7&lt;/u&gt;&lt;/span&gt;&lt;/a&gt; disse durante a nossa conversa aqui na empresa 'esses profissionais costumam lan&#231;ar suas incapacidades nas pessoas ou rotinas a sua volta'.&lt;/p&gt;&lt;br /&gt;&lt;p style="margin-bottom:0;"&gt; Sempre podemos otimizar os processos em nosso ambiente de trabalho - afinal de contas, &#233; assim que nos destacamos. Mas nunca devemos nos esquecer que os processos s&#227;o formados por pessoas, e que elas s&#227;o a parte mais importante do sistema. Se essas pessoas n&#227;o enxergarem que voc&#234; esta ali para acrescentar, &#233; melhor voc&#234; repensar seus conceitos ou procurar o telefone da antiga empresa onde trabalhava.&lt;/p&gt;</description>
      <guid>/</guid>
    </item>
    <item>
      <title>Experimentando o Slackware 12</title>
      <link>http://www.blogdopedro.net/2008/07/22/experimentando-o-slackware-12</link>
      <description>Ola pessoal, saindo um pouco das linhas de codigo, decidi conversar com voc&#234;s um pouco sobre um mito que o Linux, em especial o Slackware, &#233; um SO  quase imposs&#237;vel de ser operado de t&#227;o complexo. Com isso vou descrever minhas experi&#234;ncias com o Slackware 12.1 - a vers&#227;o mais recente.&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;Lembrando que esse post n&#227;o &#233; mais um daqueles &#8220;Instalando o Slackware passo-a-passo&#8221;. Existem inumeros destes na internet  e no final do post eu colocarei alguns deles.&lt;br /&gt;&lt;/p&gt;&lt;p style="margin-bottom:0;"&gt; &lt;/p&gt;&lt;b&gt;Qual &#233; a dificuldade em se trabalhar no Linux ?&lt;/b&gt;&lt;br /&gt;&lt;p style="margin-bottom:0;"&gt;Por que alguns profissionais de TI teimam em migrar para o Linux com a desculpa deste SO ser extremamente complexo ? Isso n&#227;o &#233; real. H&#225; quase 2 anos atr&#225;s eu decidi ir de cabeca para o Linux. Para isso, em um momento kamikaze, tirei por completo o Windows do meu pc dom&#233;stico e deixei na &#233;poca apenas com o Suse 10.&lt;/p&gt;&lt;br /&gt;&lt;p style="margin-bottom:0;"&gt;Ap&#243;s a configura&#231;&#227;o e instala&#231;&#227;o atrav&#233;s de um setup completamente grafico e intuitivo, cai direto no KDE ( que &#233; um dos principais gerenciadores de janelas do Linux ), com todos os hardwares do meu PC configurados e funcionando. Em uma pr&#233;via compara&#231;&#227;o (sadia) com o Windows, at&#233; a vers&#227;o XP ( que foi a ultima que eu mexi), o Linux se mostrou mais facil de se instalar que o MS Win. For a o fato de que a instala&#231;&#227;o do Linux j&#225; deixa seu computador com pacote de programas para Escrit&#243;rio, grava&#231;&#227;o de CD, programas para Design entre outros.&lt;/p&gt;&lt;br /&gt;&lt;p style="margin-bottom:0;"&gt;A &#250;nica coisa que tive que fazer foi configurar o Linux para abrir conex&#227;o a internet via um modem adsl que eu tinha. Para isso foi s&#243; eu dar um &lt;b&gt;adsl-setup&lt;/b&gt; no modo console para configurar tudo. Depois, para abrir efetivamente a conex&#227;o, foi soh dar um &lt;b&gt;adsl-start&lt;/b&gt; ( que mas tarde aprendi a como colocar no startup do pinguim). Em outra compara&#231;&#227;o com o Windows, na &#233;poca que eu ainda n&#227;o tinha roteado o meu modem, tinha que instalar um CD com os drivers do Modem e ums aplicativos de gerenciamento de conex&#227;o. E como eu sempre perdia o CD, sempre estava em apuros. Depois que roteei meu modem adsl era s&#243; plugar o cabo de rede no pc que eu ja estava na internet em qualquer um dos sistemas operacionais.&lt;/p&gt;&lt;br /&gt;&lt;p style="margin-bottom:0;"&gt;Minha primeira experi&#234;ncia real com o Linux havia sido bastante satisfat&#243;ria e, ao contr&#225;rio do que muitos me falavam, n&#227;o tive problema algum com o pinguim.&lt;/p&gt;&lt;br /&gt;&lt;p style="margin-bottom:0;"&gt; &lt;b&gt;Grande (?) dificuldade : Wireless no Laptop.&lt;/b&gt;&lt;/p&gt;&lt;br /&gt;&lt;p style="margin-bottom:0;"&gt;O tempo passou e com muito esfor&#231;o vendendo produtos de Herbalife, Foreverliving e lendo anuncios no pc que me retornam 0.001 centavo de dolar, eu consegui comprar meu laptop. Era (e ainda &#233;) um HP DV5020, um modelo hoje ja fora de linha.&lt;/p&gt;&lt;br /&gt;&lt;p style="margin-bottom:0;"&gt;Acontece que ele veio com uma placa wireless chamada Broadcom 4318, mas conhecida no mundo Linux como uma das BCM 43XX . Pois &#233;, como a fabricante decicidiu insistentemente n&#227;o querer que o pessoal do mundo *nix utilizasse sua placa em seus pcs, ela n&#227;o desenvolveu nenhum driver para nossa plataforma e nem disponibilizou seu codigo fonte para que um dos nosso g&#234;nios podesse recompila-los.&lt;/p&gt;&lt;br /&gt;&lt;p style="margin-bottom:0;"&gt;Na &#233;poca, a unica solu&#231;&#227;o que tive dispon&#237;vel foi utilizar uma t&#233;cnica do Linux que utiliza o driver do Windows no Linux atrav&#233;s de um pequeno emulador chamado &lt;b&gt;ndiswrapper ( &lt;/b&gt;&lt;span style="color:#000080;"&gt;&lt;u&gt;&lt;a href="http://ndiswrapper.sourceforge.net/joomla/"&gt;&lt;span style="color:rgb(51,51,153);"&gt;&lt;b&gt;http://ndiswrapper.sourceforge.net/joomla/&lt;/b&gt;&lt;/span&gt;&lt;/a&gt;&lt;/u&gt;&lt;/span&gt;&lt;b&gt;) &lt;/b&gt; .&lt;/p&gt;&lt;br /&gt;&lt;p style="margin-bottom:0;"&gt;Como eu j&#225; tinha ouvido falar bem do Ubuntu em laptops e um amigo ja o tinha baixado, decidi experiment&#225;-lo. E gostei muito do que vi. Utilizar o &lt;b&gt;ndiswrrapper&lt;/b&gt; nele era uma quest&#227;o de alguns cliques.  Como o Ubuntu s&#243; vem com um CD de instala&#231;&#227;o, tive que baixar da internet alguns  programas que eu precisava, mas nada alarmante. O tempo passou, eu migrei para o Ubuntu 7.10 - at&#233; ent&#227;o a atual vers&#227;o. Era tudo felicidade.&lt;/p&gt;&lt;br /&gt;&lt;p style="margin-bottom:0;"&gt;Confesso que at&#233; o Ubuntu 7.10 eu nunca havia precisado muito do console.  Fazia uma coisa o outra s&#243; para tentar aprender, por&#233;m, ainda tinha um certo medo da tela preta.&lt;/p&gt;&lt;br /&gt;&lt;p style="margin-bottom:0;"&gt; &lt;b&gt;Por que Slackware ? &lt;/b&gt;&lt;/p&gt;&lt;br /&gt;&lt;p style="margin-bottom:0;"&gt;A ignor&#226;ncia me irrita e por isso eu me sentia incomodado em ter uma janela bonitinha com um passo-a-passo misterioso sempre a m&#227;o para todos os meus problemas. N&#227;o estou falando mal do Ubuntu ou Suse ( inclusive s&#224;o as distros que eu aconselho a qualquer um que esteja entrando no mundo Linux ) mas eu queria aprender mais sobre o Linux em si, sem tentadores GUI que me fa&#231;am a pular fases de aprendizados. Seguindo o conselho do pessoal aqui da &lt;a name="www.3jane.com"&gt;&lt;span style="color:rgb(51,51,153);"&gt;3Jane&lt;/span&gt;&lt;/a&gt;, decidi instalar o Slackware.&lt;/p&gt;&lt;br /&gt;&lt;p style="margin-bottom:0;"&gt; &lt;b&gt;Minha primeira impress&#227;o.&lt;/b&gt;&lt;/p&gt;&lt;br /&gt;&lt;p style="margin-bottom:0;"&gt;Peguei o DVD da ultima vers&#227;o, e instalei. Setup n&#227;o era t&#227;o grafico, por&#233;m, de f&#225;cil entendimento mesmo para quem n&#227;o tinha buscado maiores informa&#231;&#245;es sobre ele. A instala&#231;&#227;o foi rapida e indolor.&lt;/p&gt;&lt;br /&gt;&lt;p style="margin-bottom:0;"&gt;O computador deu um reboot. Ap&#243;s eu selecionar o Slackware no gerenciador de boot ( Lilo ),  ele comecou a carregar o SO. J&#225; carregado, eis que surge a tela preta e um cursor piscando na tela pedido o login e senha.  Loguei, apareceram algumas poucas informa&#231;&#245;es e voltei para o cursor piscando, agora n&#227;o mais pedindo um usu&#225;rio, mas sim esperando algum comando.  &#201; neste pondo que algu&#233;m pensa: &#8220;O Slackware &#233; isso ? Nada de interfaces gr&#225;ficas, janelas ou algo parecido ?&#8221;.&lt;/p&gt;&lt;br /&gt;&lt;p style="margin-bottom:0;"&gt;Calma. O Slack antes de tudo &#233; um SO voltado para o que voc&#234; pede, e n&#227;o para o que algu&#233;m acha que voc&#234; iria pedir. Ele tem sim um gerenciador de janelas ( na verdade ele ja vem com v&#225;rios ). Se quiser entrar em um gerenciador, tente o comando &lt;b&gt;startx&lt;/b&gt; . Ele inicia o Window Manager padr&#227;o. Se voc&#234; quiser ver a lista de WM instalados para experimentar outros, antes de iniciar o modo grafico, digite  &lt;b&gt;xwmconfig &lt;/b&gt;no terminal - ira aparecer todos os WMs dispon&#237;veis, escolha o seu e tecle enter. Depois inicie o modo grafico com o &lt;b&gt;startx&lt;/b&gt; e teste seu novo WM.&lt;/p&gt;&lt;br /&gt;&lt;p style="margin-bottom:0;"&gt; &lt;b&gt;Coisas que fiz.&lt;/b&gt; &lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;i&gt;Criando a conta de usuario.&lt;/i&gt;&lt;/p&gt;Primeira coisa a ser feita em qualquer sistema operacional descente &#233; separar as contas de root ( administrador ) e de usuarios ou servi&#231;os. A conta de root s&#243; deve ser utilizada para configura&#231;&#227;o do SO. As demais contas que cubram as outras necessidades.&lt;br /&gt;&lt;p style="margin-bottom:0;"&gt; &lt;i&gt;E a minha placa wireless ?&lt;/i&gt;&lt;/p&gt;&lt;p&gt;Se lembra que eu disse que tive um problema com minha placa wireless por causa da falta de driver para Linux ? Nesta &#250;ltima vers&#227;o do kernel do Linux ( 2.6.24.xx), os g&#234;nios do pinguim construiram um driver para minha Wireless com 100% de suporte, atrav&#233;s de engenharia reversa. Verdadeiros artistas. O driver ficou t&#227;o bom que incluiram o modulo no kernel.&lt;br /&gt;&lt;/p&gt;&lt;p style="margin-bottom:0;"&gt;Logo n&#227;o preciso configurar nem ficar emulando um driver de outra plataforma no meu Slack ( ou em qualquer outra distro com as ultimas vers&#245;es do kernel Linux).&lt;/p&gt;&lt;br /&gt;&lt;p style="margin-bottom:0;"&gt;Se voc&#234; utilizar o KDE, notar&#225; que ele vem com uma s&#233;rie de ferramentas administrativas. Cheque se as interfaces de rede wireless est&#227;o ativas e ent&#227;o execute o kwifi para entrar em alguma rede wireless. E obvio que d&#225; para fazer isso em modo texto. Provavelmente ficar&#225; assim:&lt;/p&gt;&lt;br /&gt;&lt;p style="margin-bottom:0;"&gt;&lt;i&gt;ifconfig eth1 up&lt;/i&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style="margin-bottom:0;"&gt;&lt;i&gt;iwconfig eth1 essid minharedewireless key [1] 0000000000&lt;/i&gt;&lt;/p&gt;&lt;p&gt;&lt;i&gt;dhclient eth1&lt;/i&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style="margin-bottom:0;"&gt; &lt;/p&gt;Onde eth1 ser&#225; a sua interface de rede,
minharedewireless &#233; o nome da sua rede e 000000000 &#233; a senha ( se a rede for protegida ). A ultima linha eu preciso porque meu modem adsl esta roteado, e portando preciso que ele forne&#231;a IP para a minha placa wireless. Claro que isso pode variar de rede pra rede, por isso, se voc&#234; quiser algo mais inst&#226;ntaneo fa&#231;a pelo KDE.&lt;br /&gt;&lt;p style="margin-bottom:0;"&gt; &lt;/p&gt;&lt;i&gt;Placa de video e o Xorg.conf&lt;/i&gt;&lt;br /&gt;&lt;p style="margin-bottom:0;"&gt;Como meu note tem uma placa de video ATI, tive que abrir o xorg.conf ( /etc/X11/xorg.conf ) e alterar  o drive para ati. Isso mesmo, n&#227;o &#233; necessario baixar o driver, instalar ou configura-lo. S&#243; alterar o xorg.conf e ser feliz. O xorg.conf tem v&#225;rios par&#226;metros de configura&#231;&#227;o de hardware como placa de video, monitor, layout de teclado, mouse e afins. Fique tranquilo pois se voc&#234; n&#227;o quiser alterar este arquivo na m&#227;o, o KDE tem ferramenta para alterar quase tudo do xorg.conf.&lt;/p&gt;&lt;br /&gt;&lt;p style="margin-bottom:0;"&gt;Lembre sempre de fazer backup desde arquivo, porque sempre antes de iniciar seu Window Manager, o X ira consultar o xorg.conf . Se alguma coisa estiver errada, simplesmente voc&#234; n&#227;o tera as janelas coloridas ..rs.&lt;/p&gt;&lt;br /&gt;&lt;p style="margin-bottom:0;"&gt;Caso voc&#234; tenha feito alguma besteira e n&#227;o tenha backup deste arquivo ( que vergonha ), digite &lt;b&gt;xorgconfig&lt;/b&gt;  no console e siga o passo-a-passo para criar um xorg.conf novinho em folha.&lt;/p&gt;&lt;br /&gt;&lt;p style="margin-bottom:0;"&gt;&lt;i&gt;Habilitando o som.&lt;/i&gt; &lt;/p&gt;&lt;br /&gt;&lt;p style="margin-bottom:0;"&gt;Notou que n&#227;o sai som pelas suas caixas de som ? Pois &#233;, em 99% dos casos isso n&#227;o significa que o Slack n&#227;o detectou seu dispositivo de hardware, mas sim que o ALSA ( que &#233; o gerenciador de som)  n&#227;o foi configurado. Basta digitar o comando &lt;b&gt;alsaconf&lt;/b&gt; no console e seguir o passo-a-passo do configurador.&lt;/p&gt;&lt;br /&gt;&lt;p style="margin-bottom:0;"&gt;&lt;b&gt;Que tal experimentar ?&lt;/b&gt; &lt;/p&gt;&lt;br /&gt;&lt;p style="margin-bottom:0;"&gt;Quer experimentar sem instala-lo diretamente na sua m&#225;quina ? Instale um gerenciador de maquinas virtuais e teste-o. Eu indico o VirtualBox que &#233; leve, livre e funciona bem tanto no Linux quanto no Mac e Windows. No final do documento esta o link desta ferramenta.&lt;/p&gt;&lt;br /&gt;&lt;p style="margin-bottom:0;"&gt;&lt;b&gt;Considera&#231;&#245;es Finais&lt;/b&gt; &lt;/p&gt;&lt;br /&gt;&lt;p style="margin-bottom:0;"&gt;Talvez voc&#234; esteja se perguntando se vale mesmo migrar para o Slackware. Como eu disse, no meu caso valeu. Primeiro porque estou tendo que aprender um pouco mais sobre o comportamento do Linux para fazer algumas coisas que nas outras distros era s&#243; clicar e ver acontecer. Com isso ganho infinitamente mais poder sobre meu SO. &#211;BVIO que da pra voc&#234;  fazer as coisas nas outras distros de maneira mais "underground". Mas se voc&#234; S&#211; poder fazer do jeito certo &#233; bem melhor.&lt;/p&gt;&lt;br /&gt;&lt;p style="margin-bottom:0;"&gt; Outro grande motivo &#233; o ganho de performance. O Slackware incompar&#225;velmente mais r&#225;pido do que as outras distros que ja mexi. E procurando alguns benchmarks na web confimei minha teoria.&lt;/p&gt;&lt;br /&gt;&lt;p style="margin-bottom:0;"&gt;Bom esse foi um resum&#227;o da minha experi&#234;ncia com o Slackware e dos motivos que me levaram a migrar para ele.  Se tiver alguma d&#250;vida, poste na parte de coment&#225;rios que eu tentarei ajuda-lo.&lt;/p&gt;&lt;br /&gt;&lt;p style="margin-bottom:0;"&gt;&lt;b&gt;Links&lt;/b&gt; &lt;/p&gt;&lt;br /&gt;&lt;p style="margin-bottom:0;"&gt;Slackware &#8211; Site oficial -  &lt;span style="color:#000080;"&gt;&lt;u&gt;&lt;a href="http://www.slackware.org/"&gt;&lt;span style="color:rgb(51,51,153);"&gt;http://www.slackware.org/&lt;/span&gt;&lt;/a&gt;&lt;/u&gt;&lt;/span&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style="margin-bottom:0;"&gt;Site em portugu&#234;s com dicas para Slackware - &lt;span style="color:rgb(51,51,153);"&gt;&lt;a href="http://www.slackware-brasil.com.br/web_site/"&gt;http://www.slackware-brasil.com.br/web_site/&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Virtual Box &#8211; gerenciador de m&#225;quinas virtuais-  &lt;a name="www.virtualbox.org"&gt;&lt;u&gt;&lt;span style="color:rgb(51,51,153);"&gt;http://www.virtualbox.org/&lt;/span&gt;&lt;/u&gt;&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style="margin-bottom:0;"&gt;N&#227;o conhece o conceito de virtualiza&#231;&#227;o  ?  &lt;span style="color:#000080;"&gt;&lt;u&gt;&lt;a href="http://www.dx7lab.com/virtualizacao"&gt;&lt;span style="color:rgb(51,51,153);"&gt;http://www.dx7lab.com/virtualizacao&lt;/span&gt;&lt;/a&gt;&lt;/u&gt;&lt;/span&gt; &lt;/p&gt;&lt;br /&gt;&lt;p style="margin-bottom:0;"&gt;  &lt;/p&gt;Sites com passo a passo para instala&#231;&#227;o do Slackware 12 &lt;br /&gt;&lt;p style="margin-bottom:0;"&gt;1 - Video-aula da instala&#231;&#227;o do Slackware 12 - &lt;span style="color:#000080;"&gt;&lt;u&gt;&lt;a href="http://tuxtoriais.wordpress.com/2007/10/14/como-instalar-o-slackware-12/"&gt;&lt;span style="color:rgb(51,51,153);"&gt;http://tuxtoriais.wordpress.com/2007/10/14/como-instalar-o-slackware-12/&lt;/span&gt;&lt;/a&gt;&lt;/u&gt;&lt;/span&gt;&lt;span style="color:rgb(51,51,153);"&gt; &lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p style="margin-bottom:0;"&gt;2 &#8211; Outro site com o passo-a-passo -&lt;span style="color:rgb(51,51,153);"&gt; &lt;/span&gt;&lt;span style="color:#000080;"&gt;&lt;u&gt;&lt;a href="http://jrjuniorsp.wordpress.com/2008/02/27/instalando-o-linux-slackware-12-passo-a-passo/"&gt;&lt;span style="color:rgb(51,51,153);"&gt;http://jrjuniorsp.wordpress.com/2008/02/27/instalando-o-linux-slackware-12-passo-a-passo/&lt;/span&gt;&lt;/a&gt;&lt;/u&gt;&lt;/span&gt; &lt;/p&gt;&lt;br /&gt;&lt;p style="margin-bottom:0;"&gt;3 &#8211; Instala&#231;&#227;o e P&#243;s-Instala&#231;&#227;o do Slackware 12 ( &lt;span style="color:#000080;"&gt;&lt;u&gt;&lt;a href="http://www.howtoforge.com/the_perfect_desktop_slackware12"&gt;&lt;span style="color:rgb(51,51,153);"&gt;http://www.howtoforge.com/the_perfect_desktop_slackware12&lt;/span&gt;&lt;/a&gt;&lt;/u&gt;&lt;/span&gt; )&lt;/p&gt;&lt;br /&gt;&lt;p style="margin-bottom:0;"&gt; &lt;/p&gt;&lt;b&gt;Agradecimentos&lt;/b&gt; &lt;br /&gt;&lt;p style="margin-bottom:0;"&gt;&lt;span&gt;Eu n&#227;o ca&#237; de para-quedas por completo no Slackware. Existiram duas pessoas aqui da 3Jane que me deram algumas dicas : Rafael Santos e Rafael Dx7 ( &lt;/span&gt;&lt;span style="color:#000080;"&gt;&lt;u&gt;&lt;a href="http://www.dx7lab.com/"&gt;&lt;span&gt;http://www.dx7lab.com&lt;/span&gt;&lt;/a&gt;&lt;/u&gt;&lt;/span&gt;&lt;span&gt; ).&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p style="margin-bottom:0;"&gt; &lt;/p&gt;</description>
      <guid>/</guid>
    </item>
    <item>
      <title>CSS Reset</title>
      <link>http://www.blogdopedro.net/2008/07/22/css-reset</link>
      <description>&lt;p&gt;Hoje estava conversando com um colega aqui na 3Jane sobre a t&#233;cnica de "zerar" as diferen&#231;as entre a renderiza&#231;&#227;o de estilos entre os browsers para apartir de ent&#227;o come&#231;ar a escrever as folhas de estilo.&lt;/p&gt;&lt;p&gt;Claro que isso n&#227;o funciona sempre, mas j&#225; facilita bastante o come&#231;o e manuten&#231;&#227;o da camada de interface com o usu&#225;rio. A tal t&#233;cnica tem o nome sugestivo de CSS Reset. Acontece que dando uma olhada r&#225;pida na web, voc&#234; acaba encontrando "n" pessoas dizendo ter a galinha dos ovos de ouro, inclusive a pr&#243;pria Yahoo atrav&#233;s da YUI Library.&lt;/p&gt;&lt;p&gt;Depois de procurar um pouco, achei o blog &lt;a href="http://perishablepress.com/"&gt;Perishable Press&lt;/a&gt;, com uma lista de v&#225;rios desses CSS Resets e alguns coment&#225;rios. O link segue abaixo :&lt;/p&gt;&lt;p&gt;&lt;a href="http://perishablepress.com/press/2007/10/23/a-killer-collection-of-global-css-reset-styles/"&gt;http://perishablepress.com/press/2007/10/23/a-killer-collection-of-global-css-reset-styles/&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Vlw Pessoal!&lt;/p&gt;</description>
      <guid>/</guid>
    </item>
    <item>
      <title>Test your PHP applications!</title>
      <link>http://www.blogdopedro.net/2008/07/22/test-your-php-applications</link>
      <description>&lt;p&gt;Mais uma vez com um slideshow...Acho que vou mudar o nome do blog para blogdosslides. Bom, de qualquer forma, esse slideshow &#233; deveras interessante. Trata-se de mais um do Sebastian Bergmann , um dos principais desenvolvedores do PHPUnit. &lt;/p&gt;&lt;p&gt;O slide traz uma vasta explana&#231;&#227;o sobre testes no PHP. Entenda bem, n&#227;o estou dizendo que o slide fala tudo sobre TDD, mas fala sobre como aplic&#225;-lo no PHP atrav&#233;s do PHPUnit. O cara fez uma aplica&#231;&#227;o de teste e explanou sobre t&#233;cnicas auxiliares para assegurar a qualidade do seu software.&lt;br /&gt;&lt;/p&gt;&lt;div style="width:425px;text-align:left;" id="__ss_522590"&gt;&lt;div style="font-size:11px;font-family:tahoma,arial;height:26px;padding-top:2px;"&gt;&lt;/div&gt;&lt;/div&gt;</description>
      <guid>/</guid>
    </item>
    <item>
      <title>I-Scrum</title>
      <link>http://www.blogdopedro.net/2008/07/21/i-scrum</link>
      <description>&lt;p&gt;A not&#237;cia n&#227;o &#233; t&#227;o nova, mas fica registrada aqui: I-Scrum, uma comunidade social que foca debates sobre desenvolvimento &#225;geis. A id&#233;ia parece ser &#243;tima, s&#243; espero que n&#227;o vire um orkut pra nerds.&lt;/p&gt;&lt;p align="center"&gt;&lt;a href="http://i-scrum.ning.com/"&gt;http://i-scrum.ning.com/&lt;/a&gt;&lt;/p&gt;&lt;p align="center"&gt;&lt;/p&gt;&lt;p align="left"&gt;Segundo eles, agora temos um lugar certo para falarmos sobre "Scrum, XP e outras coisas relacionadas a desenvolvimento &#225;gil".  &lt;/p&gt;</description>
      <guid>/</guid>
    </item>
    <item>
      <title>Separando os meninos dos homens</title>
      <link>http://www.blogdopedro.net/2008/07/21/separando-os-meninos-dos-homens</link>
      <description>&lt;p&gt;Lendo o &lt;a id="n_jg" href="http://www.litfuel.net/plush/?postid=166" target="_blank" title="artigo do Jim Plush"&gt;artigo do Jim Plush&lt;/a&gt;, acredito que ele acertou me cheio em listar os principais conhecimentos que um profissional PHP deva ter. Desde que entrei pra &lt;a id="m5ic" href="http://www.3jane.com" target="_blank" title="3Jane"&gt;3Jane&lt;/a&gt;, j&#225; participei de algumas etapas no processo de sele&#231;&#227;o dos cadidatos para vaga de desenvolvedor PHP, e sempre os candidatos tem certos problemas com coisas elementares. Logo se voc&#234; estive aprendendo e quer um "mapa do tesouro", acredito que os itens do Jim resumem tudo: &lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;blockquote id="t6.n1"&gt;&lt;b&gt;PHP5 vs PHP4&lt;br /&gt;&lt;/b&gt;You should at least three major features that separate PHP5 from PHP4&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Networks&lt;/b&gt;&lt;br /&gt;You should be able to do some basic socket programming or at least understand how you would connect to other machines&lt;br /&gt;&lt;br /&gt;&lt;b&gt;OOP&lt;/b&gt;&lt;br /&gt;You should have a deep understanding of OOP and be able to answer simple questions like how private and protected methods differ. You should understand the following concepts(not really critical you use all of them but at least know why you would need them)&lt;br /&gt;&lt;br /&gt;* interfaces&lt;br /&gt;* constructors&lt;br /&gt;* private, public, protected&lt;br /&gt;* inheritance &lt;br /&gt;* polymorphism&lt;br /&gt;* static methods&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Database&lt;/b&gt;&lt;br /&gt;You should know what a normalized database is, you should understand primary and foreign keys, &lt;br /&gt;&lt;br /&gt;&lt;b&gt;Design Patterns&lt;/b&gt;&lt;br /&gt;You shouldn't say "huh?" when I mention design patterns. Again, not critical you use that many, but important you understand why they're helpful and know at least a couple.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Source Control&lt;/b&gt;&lt;br /&gt;You should be well versed in at least one major source control system (ZIP FILES IN TEMP DIRECTORIES DON'T COUNT!). bonus points for being able to name at least one reason cvs is a pain in the ass.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Unit Testing&lt;/b&gt;&lt;br /&gt;You should understand what unit testing is, and why it's important (bonus points for test driven design, knowing how to unit test javascript, or how to use selenium).&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Part of the Community&lt;/b&gt;&lt;br /&gt;I should be able to find all sorts of good things on google that you're doing with php or web technologies, It generally is a red flag when I google you and nothing comes up(bonus points for having a project of your own or contributing to one).&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Javascript Skills&lt;/b&gt;&lt;br /&gt;You should know the methods use to manipulate the DOM (appendChild, removeChild, nextSibling, etc...), you should know how to create your own classes in JS (FORM VALIDATION IS 1999), bonus points for being able to show how to make a private variable in javascript.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;CSS Skills&lt;/b&gt;&lt;br /&gt;You should know the box model inside and out, understand css selectors and how to use inheritance&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Passion for Improvement&lt;/b&gt;&lt;br /&gt;I want you love what you do and not be looking for a bare minimum, what's the least I can do to get out of here at 5 job. You should be looking to build your skill sets and become more valuable.&lt;br /&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;font size="1"&gt;&lt;a id="c5uo" href="http://www.litfuel.net/plush/?postid=166" target="_blank" title="Fonte: http://www.litfuel.net/plush/?postid=166"&gt;Fonte: http://www.litfuel.net/plush/?postid=166&lt;/a&gt;&lt;/font&gt;&lt;/p&gt;&lt;/blockquote&gt;Confesso que embora os itens sejam poucos, eles s&#227;o bastante vastos e &#233; imposs&#237;vel dominar todos de uma hora pra outra. E n&#227;o somente isso, muitas vezes faltam livros t&#233;cnicos voltados para nossa plataforma, o que nos obriga a procurar por materiais em outras linguagems, como em Java por exemplo. Aqui no Brasil, algumas vezes o PHP tem uma imagem de "menos enterprise" que outras plataformas de desenvolvimento web, muito por culpa do mercado que ele tem maior participa&#231;&#227;o. Vamos estudar pra mudar isso!&lt;br /&gt;</description>
      <guid>/</guid>
    </item>
    <item>
      <title>PHP 5.3 Features</title>
      <link>http://www.blogdopedro.net/2008/07/21/php-53-features</link>
      <description>&lt;p&gt;O sr. &lt;a href="http://ilia.ws/"&gt;Ilia Alshanetsky&lt;/a&gt; ( ufa!)  andou liberando no blog dele um pdf com as features do PHP 5.3. Coloquei no Rapidshare e o link segue abaixo:&lt;/p&gt;&lt;p align="center"&gt;&lt;a href="http://rapidshare.com/files/131456385/php53.pdf.html"&gt;http://rapidshare.com/files/131456385/php53.pdf.html&lt;/a&gt;&lt;/p&gt;&lt;p align="center"&gt;&lt;/p&gt;&lt;p align="left"&gt;A principais mudan&#231;as ao meu ver ser&#227;o:&lt;/p&gt;&lt;ul&gt;&lt;li align="left"&gt;Feature complete implementation of namespaces&lt;/li&gt;&lt;li align="left"&gt;Overall Improvement 5-15%&lt;/li&gt;&lt;li align="left"&gt;Introduced __DIR__ magic constant indicating the directory where the script is located&lt;/li&gt;&lt;li align="left"&gt;&lt;strong&gt;?: &lt;/strong&gt;Operator : Allows quick retrieval of a values and/or expressions&lt;/li&gt;&lt;li align="left"&gt;__callStatic() : __call() equivalent, but for static methods&lt;/li&gt;&lt;/ul&gt;&lt;p align="left"&gt;Existem outras importantes modifica&#231;&#245;es, entre elas no php.ini, PDO, E_DEPRECATED ( novo error mode)  e no Garbage Collector. Vamos ver no que d&#225;...&lt;/p&gt;&lt;p align="left"&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <guid>/</guid>
    </item>
    <item>
      <title>Desenvolvimento Web e Seguran&#231;a</title>
      <link>http://www.blogdopedro.net/2008/07/18/desenvolvimento-web-e-seguranca</link>
      <description>&lt;p&gt;Continuando na onda dos slideshows, hoje estava lendo um sobre seguran&#231;a na web em aplica&#231;&#245;es PHP. Aborda o b&#225;sico de forma direta.  Fala sobre Data Input, XSS, SQL Injection, Code Injection, alguma coisa sobre sess&#227;o e um pouquinho sobre servidores compartilhados. Seus autores s&#227;o Anish e Mudha - n&#227;o fa&#231;o a m&#237;nima ideia de quem sejam...&lt;/p&gt;

&lt;div align="center"&gt;&lt;div style="width:425px" id="__ss_108018"&gt;&lt;strong style="display:block;margin:12px 0 4px"&gt;&lt;a href="http://www.slideshare.net/manugoel2003/php-security" title="PHP Security"&gt;PHP Security&lt;/a&gt;&lt;/strong&gt;&lt;object width="425" height="355"&gt;&lt;param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=php-security3895&amp;stripped_title=php-security" /&gt;&lt;param name="allowFullScreen" value="true"/&gt;&lt;param name="allowScriptAccess" value="always"/&gt;&lt;embed src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=php-security3895&amp;stripped_title=php-security" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div style="padding:5px 0 12px"&gt;View more &lt;a href="http://www.slideshare.net/"&gt;presentations&lt;/a&gt; from &lt;a href="http://www.slideshare.net/manugoel2003"&gt;manugoel2003&lt;/a&gt;.&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</description>
      <guid>/</guid>
    </item>
    <item>
      <title>Acessando atributos privados de um objeto em PHP</title>
      <link>http://www.blogdopedro.net/2008/07/18/acessando-atributos-privados-de-um-objeto-em-php</link>
      <description>Lendo o ultimo slideshow ( do Sebastian)  sobre a OOP no PHP, no slide 28 ele mostrou inocentemente um exemplo que me deixou no m&#237;nimo curioso. Ele cria um m&#233;todo qualquer em uma classe, que recebe por paramentro um objeto qualquer, e ent&#227;o consegue trabalhar com esse objeto como se TODOS os atributos fossem publicos.N&#227;o muito satisfeito com o exemplo do slideshow do carinha, eu realizei meus pr&#243;prios testes. Eis ai os resultados:&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;b&gt;1&#186; - Tirando a prova real do exemplo do rapaz ( acessando um atributo privado de&lt;/b&gt;&lt;b&gt; um outro objeto do mesmo tipo ) :&lt;/b&gt;

&lt;pre class="code"&gt;&amp;lt;?php&lt;br /&gt;&lt;br /&gt;    class test {&lt;br /&gt;&lt;br /&gt;&lt;div id="yy6:0" &gt;        private $privateAtribute = "Atribute accessible";&lt;br /&gt;&lt;br /&gt;  public function printMe( $obj ) {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;    privateAtribute .= ' changed';&lt;br /&gt;    print $obj-&amp;gt;privateAtribute;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div id="yy6:1" &gt;  }&lt;br /&gt;&lt;/div&gt;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; $test = new test;&lt;br /&gt; $test-&amp;gt;printMe(new test);&lt;br /&gt;&lt;br /&gt;?&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Saida: &lt;span &gt;Atribute accessible changed&lt;/b&gt;&lt;/pre&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;b&gt;2&#186; - Acessando um atributo privado do mesmo objeto &lt;br /&gt;&lt;/b&gt;&lt;span &gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;pre class="code"  id="h3ai4"&gt;&lt;span &gt;&amp;lt;?php&lt;br /&gt;class test {&lt;br /&gt;&lt;div id="k-sp" &gt;private $privateAtribute = "Atribute accessible";&lt;/div&gt;&lt;div id="k-sp0" &gt;&lt;br /&gt;public function printMe( test $obj ) {       &lt;/div&gt;&lt;div id="k-sp6" &gt;&lt;p style="margin-left:40px;"&gt;&lt;br /&gt;&lt;p style="margin-left:40px;"&gt;$obj-&amp;gt;privateAtribute .= ' changed';&lt;/div&gt;&lt;div id="k-sp8"&gt;print $obj-&amp;gt;privateAtribute;&lt;br /&gt;&lt;/div&gt; &lt;div id="k-sp12" &gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/div&gt; }&lt;br /&gt; &lt;br /&gt;$test = new test;&lt;br /&gt; $test-&amp;gt;printMe($test); &lt;br /&gt; ?&amp;gt;&lt;br /&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt; &lt;p &gt;&lt;b&gt;Saida: &lt;span &gt;Atribute accessible changed&lt;/b&gt;&lt;/pre&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;b&gt;3&#186; -&lt;/b&gt;&lt;b&gt; A&lt;/b&gt;&lt;b&gt;cessando um atributo privado de um outro objeto de tipo diferente&lt;/b&gt;  &lt;span &gt;&lt;span &gt; &lt;br /&gt;&lt;pre class="code"  id="wdap"&gt;&amp;lt;?php&lt;br /&gt;&lt;br /&gt;class testA {&lt;br /&gt;&lt;br /&gt;&lt;div id="wdap4" style="margin-left:40px;"&gt;private $privateAtribute = "Type A - Atribute accessible";&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;class testB {&lt;br /&gt;&lt;br /&gt;&lt;div id="wdap11" style="margin-left:40px;"&gt;private $privateAtribute = "Type B - Atribute accessible";&lt;br /&gt;&lt;br /&gt; public function printMe(  $obj ) {&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div id="wdap17" style="margin-left:40px;"&gt;&lt;div id="wdap18" style="margin-left:40px;"&gt;print $obj-&amp;gt;privateAtribute;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div id="wdap20" style="margin-left:40px;"&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;}&lt;br /&gt;&lt;br /&gt;$test = new testB;&lt;br /&gt;$test-&amp;gt;printMe(new testA);&lt;br /&gt; &lt;br /&gt;?&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;   &lt;b&gt;Saida: &lt;/b&gt;&lt;span &gt;&lt;b&gt;Fatal error: Cannot access private property testA::$privateAtribute in C:xampphtdocstestindex.php on line 15&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Por fim, ele s&#243; lan&#231;ou erro quando os objetos eram de tipos diferentes. Vendo alguns testes que o &lt;a id="rq8i141" href="http://dx7lab.com/"&gt;dx7lab&lt;/a&gt; fez aqui na 3jane, vi que em Java a coisa funciona do mesmo jeito.  Eu hein...&lt;br /&gt;&lt;div id="wdap36"&gt;            &lt;/div&gt;</description>
      <guid>/</guid>
    </item>
    <item>
      <title>Desenvolvimento Web e Seguran&#231;a</title>
      <link>http://www.blogdopedro.net/2008/07/18/desenvolvimento-web-e-seguranca</link>
      <description>&lt;p&gt;Continuando na onda dos slideshows, hoje estava lendo um sobre seguran&#231;a na web em aplica&#231;&#245;es PHP. Aborda o b&#225;sico de forma direta.  Fala sobre Data Input, XSS, SQL Injection, Code Injection, alguma coisa sobre sess&#227;o e um pouquinho sobre servidores compartilhados. Seus autores s&#227;o Anish e Mudha - n&#227;o fa&#231;o a m&#237;nima ideia de quem sejam...&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div style="width:425px;text-align:left;" id="__ss_108018"&gt;&lt;div style="font-size:11px;font-family:tahoma,arial;height:26px;padding-top:2px;"&gt;view &lt;a href="http://www.slideshare.net/manugoel2003/php-security?src=embed" title="View PHP Security on SlideShare"&gt;presentation&lt;/a&gt; (tags: &lt;a href="http://slideshare.net/tag/php"&gt;php&lt;/a&gt; &lt;a href="http://slideshare.net/tag/security"&gt;security&lt;/a&gt;)&lt;/div&gt;&lt;/div&gt;</description>
      <guid>/</guid>
    </item>
    <item>
      <title>PHP Object Model</title>
      <link>http://www.blogdopedro.net/2008/07/17/php-object-model</link>
      <description>&lt;p&gt;Mais um slide show... Desta vez &#233; de um desenvolvedor chamado Sebastian Bergmann, um dos desenvolvedores do PHPUnit. Ele da um resum&#227;o da implementa&#231;&#227;o da OOP no PHP.&lt;/p&gt;

&lt;div align="center"&gt;&lt;div style="width:425px" id="__ss_423889"&gt;&lt;strong style="display:block;margin:12px 0 4px"&gt;&lt;a href="http://www.slideshare.net/sebastian_bergmann/understanding-the-php-object-model" title="Understanding the PHP Object Model"&gt;Understanding the PHP Object Model&lt;/a&gt;&lt;/strong&gt;&lt;object width="425" height="355"&gt;&lt;param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=20080522phptek-1211544400120012-8&amp;stripped_title=understanding-the-php-object-model" /&gt;&lt;param name="allowFullScreen" value="true"/&gt;&lt;param name="allowScriptAccess" value="always"/&gt;&lt;embed src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=20080522phptek-1211544400120012-8&amp;stripped_title=understanding-the-php-object-model" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div style="padding:5px 0 12px"&gt;View more &lt;a href="http://www.slideshare.net/"&gt;presentations&lt;/a&gt; from &lt;a href="http://www.slideshare.net/sebastian_bergmann"&gt;Sebastian Bergmann&lt;/a&gt;.&lt;/div&gt;&lt;/div&gt; &lt;/div&gt;</description>
      <guid>/</guid>
    </item>
    <item>
      <title>Overload de Propriedades e M&#233;todos em PHP</title>
      <link>http://www.blogdopedro.net/2008/06/30/overload-de-propriedades-e-metodos-em-php</link>
      <description>Essa dica &#233; velha mas sempre &#233; &#250;til:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;__get( $propriedade ) {}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Estoura quando se tenta ler o conte&#250;do de um atributo que n&#227;o exista na sua classe. O par&#226;metro que ela recebe sempre ser&#225; o nome da atributo inexistente.&lt;br /&gt;&lt;br /&gt;Por exemplo:&lt;br /&gt;&lt;br /&gt;&lt;span style="color:rgb(204,0,0);"&gt;class casa {&lt;/span&gt;&lt;br /&gt;&lt;br /&gt; &lt;span style="color:rgb(204,0,0);"&gt;function __get( $propriedade ) {&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:rgb(204,0,0);"&gt;         throw new Exception("A propriedade $propriedade n&#227;o existe no objeto " . get_class($this) );&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:rgb(204,0,0);"&gt;    }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:rgb(204,0,0);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;__set( $propriedade, $valor ) {}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Exatamente como a de cima, por&#233;m, como &#233; de se perceber, s&#243; estoura quando se tenta atribuir algum valor a um atributo inexistente. O primeiro o par&#226;metro &#233; o nome do atributo, o segundo o valor. Acho que n&#227;o precisa de exemplo neh ? Qualquer coisa adapte o de cima....&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;__call( $metodo , $argumentos ) {}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Este &#250;timo serve para a chamada de m&#233;todos inexistentes...  O primeiro par&#226;metro, obviamente &#233; o nome do m&#233;todo e o segundo par&#226;metro &#233; um array com os valores passados como par&#226;metros.</description>
      <guid>/</guid>
    </item>
    <item>
      <title>Checando tipagem de objetos por par&#226;metro</title>
      <link>http://www.blogdopedro.net/2008/06/30/checando-tipagem-de-objetos-por-parametro</link>
      <description>Em PHP, como tudo &#233; din&#226;mico - at&#233; a tipagem de vari&#225;veis, &#233; comum quando trabalhamos com objeto verificar seu tipo com o instanceof. Mas existem um jeito mais elegante que &#233; o seguinte:

&lt;pre class="code"&gt;
class carro {
    ... bla bla bla ...
}

class cavalo {
    ... bla bla bla ...
}

function imprimeCarros( carro $umCarro ) {
    print $umCarro;
}

$meuCarro = new carro();
$meuCavalo = new cavalo();

imprimeCarros( $meuCarro );
imprimeCavalos( $meuCavalo );
&lt;/pre&gt;

Na primeira chamada de imprimeCarro vai ocorrer tudo ok.  Na segunda chamada, como o tipo de objeto &#233; diferente, vai estourar um erro. Sei que parece &#243;bvio mas, deixa o c&#243;digo mais elegante...</description>
      <guid>/</guid>
    </item>
    <item>
      <title>Primeiro Livro de RoR &#233; Brasileiro</title>
      <link>http://www.blogdopedro.net/2008/06/16/primeiro-livro-de-ror-e-brasileiro</link>
      <description>Isso mesmo, o primeiro livro de RoR 2.1 &#233; tupiniquim. Gra&#231;as ao trabalho de &lt;a href="http://www.nomedojogo.com/2008/06/06/o-primeiro-livro-sobre-rails-21-e-brasileiro/"&gt;Carlos Brando&lt;/a&gt; e &lt;a href="http://www.improveit.com.br/empresa/tapajos"&gt;Marcos Tapaj&#243;s&lt;/a&gt; .&lt;br /&gt;&lt;br /&gt;Para baixar, &lt;a href="http://www.nomedojogo.com/livro/carlosbrando-rubyonrails21.pdf"&gt;clique aqui&lt;/a&gt;.</description>
      <guid>/</guid>
    </item>
    <item>
      <title>Hello World em Rails</title>
      <link>http://www.blogdopedro.net/2008/05/26/hello-world-em-rails</link>
      <description>Fala pessoal...

Esse final de semana tirei algumas horas para estudar Ruby on Rails. Como n&#227;o tenho um vasto conhecimento na plataforma, n&#227;o vou me deixar guiar pelas poucas coisas que vi. O que posso dizer &#233; que at&#233; ent&#227;o tenho gostado.

&lt;span style="font-weight:bold;"&gt;Configurando no Windows&lt;/span&gt;

Mesmo estando on Windows, achei a configura&#231;&#227;o do ambiente de desenvolvimento extremamente simples. Basta baixar a ultima vers&#227;o do &lt;a href="http://rubyforge.org/frs/download.php/29263/ruby186-26.exe"&gt;Ruby&lt;/a&gt; no pr&#243;prio site do &lt;a href="http://www.rubyonrails.org/"&gt;RoR&lt;/a&gt; e realizar alguns passos simples. Depois de r&#225;pidos next &amp;gt; next &amp;gt;finish, o Ruby teoricamente estar&#225; instalado. Basta agora instalar o framework Rails, abrindo o console do windows e digitando:
&lt;div style="text-align:center;"&gt;&lt;span style="color:#cc0000;"&gt;gem install rails --include-dependencies&lt;/span&gt;&lt;/div&gt;
&lt;span style="font-weight:bold;"&gt;Sua primeira aplica&#231;&#227;o&lt;/span&gt;

Pronto! Ruby e Rails instalados. Para criar um "hello world", basta agora criar uma pasta em algum lugar ( de prefer&#234;ncia via Console ) e logo ap&#243;s, dar um rails "nome a aplica&#231;&#227;o". Mais ou menos assim:
&lt;div style="text-align:center;"&gt;&lt;span style="color:#cc0000;"&gt;md C:\rubydevs&lt;/span&gt;
&lt;span style="color:#cc0000;"&gt;cd C:\rubydevs&lt;/span&gt;
&lt;span style="color:#cc0000;"&gt;rails hello&lt;/span&gt;&lt;/div&gt;
Como &#233; not&#243;rio, criei um diret&#243;rio na raiz e, na ultima linha chamei o daemon do rails dando o nome da minha futura aplica&#231;&#227;o. Ele automaticamente cria toda a estrutura de desenvolvimento que preciso, colocando todos os arquivos usados pelo RoR l&#225;.

Para criar um primeiro controle para sua aplica&#231;&#227;o, entre no diret&#243;rio do projeto ( no meu caso hello ) e, via prompt, fa&#231;a o seguinte:
&lt;div style="text-align:center;"&gt;&lt;span style="color:#cc0000;"&gt;ruby script/generate controller helloworld&lt;/span&gt;&lt;/div&gt;
Fazendo isso, usamos um script gerador que j&#225; faz algumas coisas &#250;teis para n&#243;s ( como criar helper e test para o controle novo).

Agora &#233; hora de criarmos alguma a&#231;&#227;o para o novo controler. Que tal sairmos um pouco do maldit... ehrr... bom, quero dizer, ador&#225;vel Console do Windows ? A pr&#243;pria instala&#231;&#227;o do Ruby j&#225; nos deixa com o SciTE, um editor de textos bacana. Se preferir uma IDE, uma dica &#233; come&#231;ar utilizando o &lt;a href="http://www.aptana.com/rails/"&gt;Aptana RadRails&lt;/a&gt; ( plugin para o Eclipse ). Se voc&#234; seguir o mesmo caminho que eu, ter&#225; que baixar o Aptana Studio ( j&#225; com o Eclipse ) e depois fazer uma pequena atualiza&#231;&#227;o para o RadRails - que aparecer&#225; automaticamente no startup do Aptana.

Depois v&#225; na pasta app/controllers e abra o controle criado - no nosso caso o &lt;span style="color:#000000;"&gt;helloworld. O nome do file sempre fica nomedocontrole_controller.rb .  A estrutura do arquivo ser&#225; identico a seguinte:&lt;/span&gt;

&lt;span style="color:#cc0000;"&gt;class HelloworldController &amp;lt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;span style="color:#cc0000;"&gt;ApplicationController&lt;/span&gt;&lt;/span&gt;
&lt;span style="color:#000000;"&gt;&lt;span style="color:#cc0000;"&gt;end&lt;/span&gt;&lt;/span&gt;

&lt;span style="color:#000000;"&gt;Temos o declarador class seguido pelo nome do controle, o "&amp;lt;" indicando heran&#231;a, o nome da classe Pai e o end finalizando a classe. Vamos criar o m&#233;todo dummie. Agora seu arquivo deve ficar da seguinte maneira: &lt;/span&gt;

&lt;span style="color:#cc0000;"&gt;class HelloworldController &amp;lt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;span style="color:#cc0000;"&gt;ApplicationController&lt;/span&gt;&lt;/span&gt;
&lt;span style="color:#000000;"&gt;&lt;span style="color:#cc0000;"&gt;&lt;span style="color:#cc0000;"&gt;&lt;span style="color:#cc0000;"&gt; &lt;span style="font-weight:bold;"&gt; def dummie &lt;/span&gt;&lt;/span&gt;
&lt;span style="color:#cc0000;font-weight:bold;"&gt; end&lt;/span&gt;
&lt;span style="color:#cc0000;"&gt;end&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;

&lt;span style="color:#000000;"&gt;J&#225; &#233; o suficiente. Vamos agora para a vis&#227;o. Dentre a estrutura de diret&#243;rios, existe um chamado views. Se voc&#234; abrir este diret&#243;rio, notar&#225; que existe um subdiret&#243;rio com o nome do seu novo controle - isso n&#227;o &#233; magia, &#233; pura tecnologia. Agora, crie um aquivo com a extens&#227;o rhtml que ser&#225; a vis&#227;o do seu controle. Como o nome da a&#231;&#227;o que criamos &#233; dummie, logo, o nome da vis&#227;o ser&#225; dummie.rhtml . Esse arquivo ser&#225; automaticamente chamado pelo RoR, quando o m&#233;todo dummie do controle for chamado. Como ele ser&#225; a parte html da sua aplica&#231;&#227;o web, escreva alguma coisa para estar no browser.&lt;/span&gt;
&lt;span style="color:#000000;"&gt;
Agora &#233; s&#243; rodar. Para isso, retorne ao console e, dentro do diret&#243;rio da sua aplica&#231;&#227;o, digite:&lt;/span&gt;
&lt;div style="text-align:center;"&gt;&lt;span style="color:#cc0000;"&gt;ruby script/server&lt;/span&gt;&lt;/div&gt;
&lt;span style="color:#000000;"&gt;
O script server levanta automaticamente o servidor na porta 3000. Para testar, v&#225; no seu browser favorito ( provavelmente Firefox, Opera ou Safari ) e teste a url:&lt;/span&gt;
&lt;div style="text-align:center;"&gt;&lt;span style="color:#000000;"&gt;&lt;span style="color:#ff0000;"&gt;http://localhost:3000/helloworld/dummie

&lt;/span&gt;&lt;/span&gt;&lt;a href="http://2.bp.blogspot.com/_gMGOvKSyf40/SDosT2emEGI/AAAAAAAAAAg/NwFv-M09osU/s1600-h/ror.jpg"&gt;&lt;img style="display:block;text-align:center;cursor:pointer;margin:0 auto 10px;" src="http://2.bp.blogspot.com/_gMGOvKSyf40/SDosT2emEGI/AAAAAAAAAAg/NwFv-M09osU/s400/ror.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;span style="color:#000000;"&gt;
Eis a&#237; a crian&#231;a. Sei que o t&#243;pico foi extremamente simples, mas tentei abordar desde a instala&#231;&#227;o a primeira aplica&#231;&#227;o.  Tenho feito alguns teste e tenho gostado do que tenho visto. Com o passar do tempo vou dividindo com voc&#234;s.&lt;/span&gt;</description>
      <guid>/</guid>
    </item>
    <item>
      <title>Console online de Ruby</title>
      <link>http://www.blogdopedro.net/2008/05/22/console-online-de-ruby</link>
      <description>Tenho me acostumado com a id&#233;ia de estudar Ruby on Rails. E como dita a regra, se Rails &#233; somente um framework sobre Ruby, nada mais l&#243;gico do que procurar ter um bom conhecimento nesta linguagem para se dar bem.&lt;br /&gt;&lt;br /&gt;Para auxiliar nesta tarefa, eis o tryruby, uma aplica&#231;&#227;o web que permite executar alguns comandos na linguagem.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align:center;color:rgb(204,0,0);font-weight:bold;"&gt;&lt;a href="http://tryruby.hobix.com/"&gt;http://tryruby.hobix.com/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;</description>
      <guid>/</guid>
    </item>
    <item>
      <title>Design Patterns no PHP</title>
      <link>http://www.blogdopedro.net/2008/05/21/design-patterns-no-php-parte-i-introducao-geral</link>
      <description>Ola pessoal, esse &#233; o primeiro estudo relacionado a PHP que publicarei no blog - e espero que seja o antecessor de muitos outros. Por o PHP ser uma linguagem extremamente f&#225;cil, tanto pela sintaxe, quanto pela comunidade de programadores que mantem blogs e f&#243;runs pela internet, cada programador PHP acaba tendo uma "escola" diferente. Obviamente, isso eh bom pois, cada um aprende de acordo com o seu pr&#243;prio ritmo de estudos, mas, in other hand, vejo muita muita gente dizendo-se programador com defici&#234;ncias em &#225;reas basicas da programa&#231;&#227;o. Falando de maneira simples, a galera ta mais preocupada em fazer &lt;em&gt;um site&lt;/em&gt; do que construir uma &lt;em&gt;solu&#231;&#227;o&lt;/em&gt;.

Pensando nisso, resolvi come&#231;ar falando a respeito de &lt;strong&gt;&lt;em&gt;Padr&#245;es de Projetos&lt;/em&gt;&lt;/strong&gt; ou &lt;strong&gt;&lt;em&gt;Padr&#245;es de Desenho de Software&lt;/em&gt;&lt;/strong&gt;, termos estes origin&#225;rios do ingl&#234;s Designer Patterns. Ao longo desse estudo, vamos tentar abordar os principais pontos de desenvolvimento de software estruturado e no final pretendo realizar um passo-a-passo de um projeto junto voc&#234;s, ok?

Antes de comer&#231;armos o estudo em si, existe um ponto muito importante que necessita ser ressaltado: o PHP, ao contr&#225;rio de outras linguagens como C ou Java por exemplo, n&#227;o &lt;em&gt;obriga &lt;/em&gt;o programador a desenvolver pensando nos moldes da Orienta&#231;&#227;o a Objetos (OO). N&#227;o caindo no m&#233;rito desta caracteristica do PHP ser boa ou ruim, &#233; importante o programador ver-se motivado a querer aprender esse padr&#227;o e utiliz&#225;-lo sempre em seus projetos. Como tem sempre aquele pessoal que aprendeu programar de uma forma, e fica meio reguardado para migrar para uma outra forma de pensar, gosto sempre de dizer que existem solu&#231;&#245;es e solu&#231;&#245;es. Como li em algum lugar certa vez "Qualquer chimpanz&#233; consegue escrever um c&#243;digo que o computador entenda, o dificil &#233; escrever um c&#243;digo que o homem tamb&#233;m possa entender". Esse &#233; o espirito da coisa.

&lt;strong&gt;Qual s&#227;o os principios da Orienta&#231;&#227;o a Objetos ?&lt;/strong&gt;

Para podermos aprendermos os Design Patterns, devemos impreterivelmente entendermos como funciona um c&#243;digo Orientado a Objetos. Um c&#243;digo OO deve seguir os seguintes conceitos :
&lt;blockquote&gt;&lt;span&gt;- &lt;span style="font-weight:bold;"&gt;Encapsulamento &lt;/span&gt;:&lt;/span&gt;
&lt;span&gt; Todo c&#243;digo que segue os moldes da OO, deve encapsular, ou seja, dividir em pequenas partes um problema/solu&#231;&#227;o bem definido. Cada parte ou capsula, deve ser independente e bem formulada, de maneira a ficar claro onde ela se aplica no seu projeto.&lt;/span&gt;

&lt;span&gt; - &lt;span style="font-weight:bold;"&gt;Generalidade&lt;/span&gt;:&lt;/span&gt;
&lt;span&gt; Todo c&#243;digo orientado a objetos deve ser construido pensando sempre em ser reaproveitado em outros projetos.&lt;/span&gt;

&lt;span&gt; - &lt;span style="font-weight:bold;"&gt;Equil&#237;brio&lt;/span&gt;:&lt;/span&gt;
&lt;span&gt; Quando escolhemos seguir um padr&#227;o em um projeto, devemos sempre usarmos o esquilibrio em at&#233; onde vamos padronizar nossos c&#243;digos. Devemos sempre analizar qual tipo de problema teremos que resolver, vermos como funcionam as solu&#231;&#245;es tradicionais e como funcionam as solu&#231;&#245;es ruins ou fracassadas. Com isso, conseguimos facilmente entender como se comportar&#225; o nosso c&#243;digo.&lt;/span&gt;

&lt;span&gt; - &lt;span style="font-weight:bold;"&gt;Abstra&#231;&#227;o&lt;/span&gt;:&lt;/span&gt;
&lt;span&gt; Para desenvolvermos um c&#243;digo elegante, devemos usar abstra&#231;&#245;es, ou seja, analizarmos os conceitos do conhecimento cotidiano na nossa vida real e aplicarmos ao nosso c&#243;digo. Parece loucura, mas realmente &#233; assim que funciona.&lt;/span&gt;
&lt;span&gt; &lt;/span&gt;
&lt;span&gt; - &lt;span style="font-weight:bold;"&gt;Abertura&lt;/span&gt;:&lt;/span&gt;
&lt;span&gt; Ao adotarmos o padr&#227;o OO em nosso c&#243;digo, ele deve ser flex&#237;vel para que cada capsula tenha liberdade de se aprofundar tanto quanto for necess&#225;rio em um problema.&lt;/span&gt;

&lt;span&gt; - &lt;span style="font-weight:bold;"&gt;Combinatoriedade&lt;/span&gt;: &lt;/span&gt;
&lt;span&gt; A capsulas em seu c&#243;digo deve ser relacionadas hierarquicamente. Isso significa que voc&#234; deve ter partes maiores em seu c&#243;digo, que se relacionam com diversas outras partes menores.&lt;/span&gt;&lt;/blockquote&gt;
Lembrando que n&#227;o &#233; necess&#225;rio voc&#234; ficar decorando esses conceitos. Basta entend&#234;-los e fazer alguns poucos exerc&#237;cios tentando combinar os itens acima. Em pouco tempo, esses conceitos ser&#227;o notados naturalmente em seus c&#243;digos.

O PHP pode n&#227;o ser considerada a linguagem-modelo ao falarmos de OO (tal como Java),  mas, atrav&#233;s da vers&#227;o 5 do nosso t&#227;o amado HyperText Preprocessor conseguimos utililzar praticamente todos os padr&#245;es mais comuns do Designer Patterns. Boiou ? Fique atento nos "pr&#243;ximos cap&#237;tulos" deste estudo que voc&#234; poder&#225; entender melhor. No pr&#243;ximo estudo falarei sobre o Modelo de Classes, explanando sobre Classes, Inst&#226;ncias, Objetos, M&#233;todos, Propriedades, Heran&#231;a entre outras coisas e, vou montar um exemplo b&#225;sico em PHP.

Links interessantes para quem quiser saber mais por enquanto:
- Apostila em PDF do Professor Fenando Lozano falando sobre diversos conceitos de OO no PHP : http://www.lozano.eti.br/palestras/oo-php.pdf
- Criar Web - POO no PHP 5 - http://www.criarweb.com/artigos/330.php
- Grupo de PHP no Yahoo! Grupos - sempre com algu&#233;m disposto a tirar duvidas - http://br.groups.yahoo.com/group/php-pt/

Um grande abra&#231;o e sorte nos estudos!
Pedro Mendes</description>
      <guid>/</guid>
    </item>
    <item>
      <title>Design Patterns no PHP</title>
      <link>http://www.blogdopedro.net/2008/05/21/design-patterns-no-php-parte-ii-criando-classes</link>
      <description>&lt;p class="MsoNormal"&gt;&lt;span lang="PT-BR"&gt;&lt;br /&gt;Dando continuidade ao estudo sobre Design Patterns no PHP, vamos hoje come&#231;ar a falar sobre o Modelo de Classes e a sua aplica&#231;&#227;o usando o PHP. No ultimo post ( Design Patterns no PHP - Introdu&#231;&#227;o Geral ), eu havia falado  sobre teorias como : Encapsulamento, Generalidade, Equil&#237;brio, Abstra&#231;&#227;o, Abertura e Combinatoriedade. Agora, levando em considera&#231;&#227;o que voc&#234; entendeu o principio te&#243;rico da coisa, vamos l&#225;. Caso n&#227;o, envie perguntas atrav&#233;s dos coment&#225;rios e/ou tente ler novamente o primeiro t&#243;pico do estudo.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;A inven&#231;&#227;o da Roda.&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;O paradigma, ou seja, modelo ou padr&#227;o da Orienta&#231;&#227;o a Objetos n&#227;o &#233; novo. Foi criado na d&#233;cada de 60/70, quando os softwares come&#231;aram a ficar extremamente complexos. Al&#233;m do motivo &#243;bvio de melhor reutiliza&#231;&#227;o do que j&#225; foi escrito, era necess&#225;rio uma forma mais eficaz na organiza&#231;&#227;o dos sistemas. At&#233; por que, cada vez mais os projetos estouravam seus prazos e valores previstos.&lt;br /&gt;&lt;br /&gt;Talvez, ao descrever o passado, muitos programadores enxerguem seu presente ou o da empresa onde trabalha. Projetos que pareciam ser extremamente simples, mas, acabam se tornando uma verdadeira Caixa de Pandora. Historicamente, a primeira linguagem a introduzir conceitos do paradigma de  Orienta&#231;&#227;o a Objetos foi a "Simula".  Logo ap&#243;s veio o Smalltalk (criada pela X&#233;rox) que se tornou a primeira linguagem popular Orientada a Objetos - e que alavancou o paradigma.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Mesmo tendo rodas, bicicleta ainda n&#227;o &#233; carro.&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Talvez algu&#233;m afirme: Mas o meu c&#243;digo &#233; organizado, afinal de contas eu o separo em varias fun&#231;&#245;es. Ser&#225; ? Em um  sistema simpl&#243;rio, como de um pequeno gerenciador de not&#237;cias, voc&#234; pode pensar que n&#227;o tem tanto a perder. Mas ai surgem quest&#245;es do tipo : E se a estrutura do banco tiver que mudar, o  quanto voc&#234; ter&#225; que alterar o seu c&#243;digo ? E se novas regras aparecerem ?  E se a fonte de dados vier de  diferentes meios (RSS, BD1, BD2, arquivos de texto, web services) ? E na hora de documentar o sistema, o que voc&#234; faz ?&lt;br /&gt;&lt;br /&gt;E l&#225; vai o bendito programador abrir um arquivo com umas trinta functions diferentes, copiando e colando uma fun&#231;&#227;o qualquer para criar a mesma coisa mas agora com um ou dois par&#226;metros diferentes. Geralmente voc&#234; ter&#225; que revisar TODO o projeto pois, n&#227;o existe uma arquitetura flex&#237;vel a mudan&#231;as.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Embora hoje a sigla OOP (Oriented Object Programming) ou POO (Programa&#231;&#227;o Orientada a Objetos) cause certo frisson, ela n&#227;o &#233; algo t&#227;o complexo a ponto de somente nerds com coeficiente de rendimento 9.9 de Harvard possam entender. A POO nada mais &#233; do que a evolu&#231;&#227;o natural da programa&#231;&#227;o procedural. Invista seus esfor&#231;os para entender a l&#243;gica da POO - n&#227;o fique t&#227;o preocupado em decorar  " qual &#233; a sintaxe no php que faz alguma coisa . &#201; realmente simples.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Voltando a falar sobre Encapsulamento.&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;No ultimo post do estudo, eu defini encapsulamento da seguinte forma :&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;i&gt; &#8220;Todo c&#243;digo que segue os moldes da OO, deve encapsular, ou seja, dividir em pequenas partes um problema/solu&#231;&#227;o bem definido. Cada parte ou c&#225;psula, deve ser independente e bem formulada, de maneira a ficar claro onde ela se aplica no seu projeto."&lt;/i&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Partindo deste principio, imagine que voc&#234; tenha umas 20 fun&#231;&#245;es que voc&#234; costuma usar sempre. Fun&#231;&#245;es como acesso ao banco de dados, valida&#231;&#227;o de formul&#225;rios, cadastro de alguma coisa em alguma tabela, etc. Voc&#234; tentou organizar seus c&#243;digos dividindo-os em pequenas partes. Mas imagine que voc&#234; pode agora melhorar a intera&#231;&#227;o dessas partes. Fazer com que elas fa&#231;am o trabalho sujo de maneira mais "automatizada". Imagine que voc&#234; pode agora alterar o comportamento das suas fun&#231;&#245;es de acordo com algum evento, melhorar o tratamento de erros, reaproveitar melhor seu c&#243;digo enfim, imagine que voc&#234; poder&#225; ter mais tempo livre para se preocupar com outras coisas. Essas s&#227;o as conseq&#252;&#234;ncias naturais da POO.&lt;br /&gt;&lt;br /&gt;Com um c&#243;digo seguindo as boas regras da POO, voc&#234; consegue maior independ&#234;ncia e controle entre as suas "c&#225;psulas". Agora voc&#234; come&#231;ar&#225; a separar seus c&#243;digos n&#227;o mais por functions, mas sim por classes, que ter&#227;o um subconjunto de fun&#231;&#245;es (m&#233;todos). Vamos ver alguma coisa mais pr&#225;tica no pr&#243;ximo t&#243;pico.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Dissecando o sapo.&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Vamos &#224; pr&#225;tica. Que tal analisarmos a estrutura de uma classe bem simples ? Ela s&#243; tem uma misera fun&#231;&#227;o (que vamos come&#231;ar a chamar de m&#233;todo) que imprime "Ola Mundo". Como o objetivo da classe &#233; estudarmos sua sintaxe, logo, n&#227;o ligue muito para essa fun&#231;&#227;o t&#227;o tola.&lt;br /&gt;&lt;br /&gt;&lt;pre class="code"&gt;&lt;i&gt;class OlaMundo{&lt;br /&gt;      &lt;br /&gt;&lt;/i&gt;&lt;/span&gt;&lt;span lang="PT-BR"&gt;&lt;i&gt;         &lt;/i&gt;&lt;/span&gt;&lt;span lang="PT-BR"&gt;&lt;i&gt;     /**&lt;br /&gt;&lt;/i&gt;&lt;/span&gt;&lt;span lang="PT-BR"&gt;&lt;i&gt;         &lt;/i&gt;&lt;/span&gt;&lt;span lang="PT-BR"&gt;&lt;i&gt;      * Classe de estudo cuja unica fun&#231;&#227;o &#233; escrever Ola Mundo&lt;br /&gt;&lt;/i&gt;&lt;/span&gt;&lt;span lang="PT-BR"&gt;&lt;i&gt;         &lt;/i&gt;&lt;/span&gt;&lt;span lang="PT-BR"&gt;&lt;i&gt;      *&lt;br /&gt;&lt;/i&gt;&lt;/span&gt;&lt;span lang="PT-BR"&gt;&lt;i&gt;         &lt;/i&gt;&lt;/span&gt;&lt;span lang="PT-BR"&gt;&lt;i&gt;      * @author            Chuck Norris.&lt;br /&gt;&lt;/i&gt;&lt;/span&gt;&lt;span lang="PT-BR"&gt;&lt;i&gt;         &lt;/i&gt;&lt;/span&gt;&lt;span lang="PT-BR"&gt;&lt;i&gt;      */&lt;br /&gt;&lt;/i&gt;&lt;/span&gt;&lt;span lang="PT-BR"&gt;&lt;i&gt;         &lt;/i&gt;&lt;/span&gt;&lt;span lang="PT-BR"&gt;&lt;i&gt;function imprime(){&lt;br /&gt;&lt;br /&gt;&lt;/i&gt;&lt;/span&gt;&lt;span lang="PT-BR"&gt;&lt;i&gt;         &lt;/i&gt;&lt;/span&gt;&lt;span lang="PT-BR"&gt;&lt;i&gt;         &lt;/i&gt;&lt;/span&gt;&lt;span lang="PT-BR"&gt;&lt;i&gt;         echo( "Ola Mundo" );&lt;br /&gt;&lt;br /&gt;&lt;/i&gt;&lt;/span&gt;&lt;span lang="PT-BR"&gt;&lt;i&gt;         &lt;/i&gt;&lt;/span&gt;&lt;span lang="PT-BR"&gt;&lt;i&gt;     }&lt;br /&gt;&lt;br /&gt;}&lt;/i&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Primeiro come&#231;amos dizendo que vamos escrever uma classe utilizando o comando &lt;b&gt;class&lt;/b&gt;, p&#243;s-cedido de um espa&#231;o e o nome da classe que iremos criar. Darei dicas  para uma boa nomenclatura de uma classe no pr&#243;ximo t&#243;pico. Logo ap&#243;s, colocamos o primeiro bracelete "{",  escrevermos todos os m&#233;todos e atributos (veremos atributos depois) e finalizamos o m&#233;todo com o bracelete "}".&lt;br /&gt;&lt;br /&gt;Em seq&#252;&#234;ncia criamos os coment&#225;rios. Isso &#233; uma verdadeira preciosidade em qualquer c&#243;digo fonte. Utilizei o mesmo padr&#227;o usado pelo javadoc, onde o coment&#225;rio deve dizer resumidamente o seguinte: O que o m&#233;todo faz, seu autor, o tipo de retorno que ela pode gerar (String, Array, Boolean, Integer, Double, Object) e os par&#226;metros (se houver). Como essa &#233; uma classe pra estudo e portanto &#233; bem simples, somente descrevi o m&#233;todo e coloquei seu autor. Sempre comente tudo o que voc&#234; criar, a ponto de qualquer outro programador conseguir entender seu c&#243;digo se guiando apenas pelos coment&#225;rios. Isso ajuda a deixar seus c&#243;digos auto-documentados.&lt;br /&gt;&lt;br /&gt;Depois, criamos nosso primeiro m&#233;todo. Note que utilizei o comando function para dizer que o que vem ap&#243;s ser&#225; um m&#233;todo. Assim como em uma fun&#231;&#227;o simples, devemos fornecer um nome ao m&#233;todo e, entre par&#234;nteses dizer se haver&#227;o par&#226;metros. Abrimos ent&#227;o o m&#233;todo com "{" e depois de tudo, fechamos com "}".&lt;br /&gt;&lt;br /&gt;Claro que o m&#233;todo criado para o exemplo &#233; extremamente simples. Mais tarde, veremos o uso do $this ( que faz referencia ao pr&#243;prio objeto), modificadores de acesso( public, private e protected), o uso de atributos heran&#231;as e polimorfismo. Vamos prosseguir.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Cada macaco no seu galho.&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;H&#225; uma filosofia no mundo Unix que &#233; : "N&#227;o desenvolva coisas grandes que tenham in&#250;meras fun&#231;&#245;es. Desenvolva coisas pequenas, que em primeiro lugar realize perfeitamente o prop&#243;sito para qual elas foram designadas e, em segundo lugar,  possam se encaixar uma com as outras, para que juntas possam fazer as mesmas in&#250;meras coisas mas com extrema perfei&#231;&#227;o".&lt;br /&gt;&lt;br /&gt;Desenvolver seguindo a l&#243;gica Orientada a Objetos, n&#227;o &#233; voc&#234; pegar todas as suas functions, escrever um "class NinhoDeUrubu { " no inicio do Armagedon  e  colocar um " } " no final.  Como j&#225; disse, o principio do enca
psulamento &#233; voc&#234; criar blocos de c&#243;digo que ir&#227;o se relacionar. N&#227;o adianta criar uma classe de  conex&#227;o com o banco de dados e colocar m&#233;todos que ir&#227;o manipular suas tabelas, envio de e-mail, contas a pagar, etc. Uma coisa &#233; a classe de conex&#227;o, outra coisa s&#227;o as suas tabelas, outra &#233; enviar e-mails, e por ai vai.&lt;br /&gt;&lt;br /&gt;Separe suas classes em arquivos diferentes e d&#234; nome CERTO aos bois. N&#227;o chame a classe que ir&#225; manipular a tabela usu&#225;rios de DbListaTodos . Pense com carinho na nomenclatura das suas classes. Tenho um amigo pseudo-chin&#234;s que sempre diz &lt;i&gt;"O principio da sabedoria consiste em voc&#234; chamar as coisas pelo nome"&lt;/i&gt;. Chame a classe conex&#227;o com o banco de dados de algo parecido com ConectaBD , ou DBConnect caso h&#225; um padr&#227;o de nomenclatura em ingl&#234;s. Outra coisa: assuma um padr&#227;o de nomenclatura para todas as suas classes. Veja um exemplo de como N&#195;O nomear as suas classes:&lt;br /&gt;&lt;br /&gt;&lt;i&gt;class connect_BasedeDados2eenviaemail {}&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;Vamos aos erros: separa&#231;&#227;o visual com letras iniciais mai&#250;sculas e underscore ao mesmo tempo; palavras em ingl&#234;s e em portugu&#234;s ao mesmo tempo (s&#243; faltou espanhol e kanji);  nome grande que n&#227;o diz muita coisa ( esta &#233; a segunda classe de conex&#227;o ou ela se conecta ao segundo banco de dados ?); uma classe que conecta ao banco de dados e envia e-mail ? Conclus&#227;o : NUNCA coloque seu nome como autor desse anticristo.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Classes hoje, objetos amanh&#227;.&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Assumindo que voc&#234; n&#227;o saiba, um objeto nada mais &#233; que a sua classe em a&#231;&#227;o, ou seja, nada mais &#233; que a sua classe &lt;b&gt;&lt;i&gt;instanciada&lt;/i&gt;&lt;/b&gt;. Diferente de uma function, uma classe precisa ser inicializada ( transformada em objeto ) para poder ser utilizada. Veja o exemplo abaixo de uma fun&#231;&#227;o que imprime "ola mundo".&lt;br /&gt;&lt;i&gt;&lt;br /&gt;&lt;span style="color:rgb(204,0,0);"&gt; function ImprimeOlaMundo() {&lt;/span&gt;&lt;br /&gt;&lt;/i&gt;&lt;/span&gt;&lt;span style="color:rgb(204,0,0);" lang="PT-BR"&gt;&lt;i&gt;         &lt;/i&gt;&lt;/span&gt;&lt;span lang="PT-BR"&gt;&lt;i&gt;        echo("Ola mundo");&lt;br /&gt;}&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;Para utilizar a fun&#231;&#227;o acima, basta somente voc&#234; chamar a fun&#231;&#227;o da seguinte forma:&lt;br /&gt;&lt;br /&gt;&lt;i&gt;ImprimeOlaMundo();&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;E pronto. Seu texto aparecer&#225; na tela. Agora, vamos construir isso utilizando uma classe ?&lt;br /&gt;&lt;br /&gt;&lt;i&gt;class OlaMundo{&lt;br /&gt;&lt;br /&gt;&lt;/i&gt;&lt;/span&gt;&lt;span style="color:rgb(204,0,0);" lang="PT-BR"&gt;&lt;i&gt;         &lt;/i&gt;&lt;/span&gt;&lt;span style="color:rgb(204,0,0);" lang="PT-BR"&gt;&lt;i&gt;     /**&lt;br /&gt;&lt;/i&gt;&lt;/span&gt;&lt;span style="color:rgb(204,0,0);" lang="PT-BR"&gt;&lt;i&gt;         &lt;/i&gt;&lt;/span&gt;&lt;span style="color:rgb(204,0,0);" lang="PT-BR"&gt;&lt;i&gt;* Escreve Ola Mundo&lt;br /&gt;&lt;/i&gt;&lt;/span&gt;&lt;span style="color:rgb(204,0,0);" lang="PT-BR"&gt;&lt;i&gt;         &lt;/i&gt;&lt;/span&gt;&lt;span style="color:rgb(204,0,0);" lang="PT-BR"&gt;&lt;i&gt;*&lt;br /&gt;&lt;/i&gt;&lt;/span&gt;&lt;span style="color:rgb(204,0,0);" lang="PT-BR"&gt;&lt;i&gt;         &lt;/i&gt;&lt;/span&gt;&lt;span style="color:rgb(204,0,0);" lang="PT-BR"&gt;&lt;i&gt;      * @author            Chuck Norris.&lt;br /&gt;&lt;/i&gt;&lt;/span&gt;&lt;span style="color:rgb(204,0,0);" lang="PT-BR"&gt;&lt;i&gt;         &lt;/i&gt;&lt;/span&gt;&lt;span style="color:rgb(204,0,0);" lang="PT-BR"&gt;&lt;i&gt;      */&lt;br /&gt;&lt;/i&gt;&lt;/span&gt;&lt;span style="color:rgb(204,0,0);" lang="PT-BR"&gt;&lt;i&gt;         &lt;/i&gt;&lt;/span&gt;&lt;span style="color:rgb(204,0,0);" lang="PT-BR"&gt;&lt;i&gt;     function imprime(){&lt;/i&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="color:rgb(204,0,0);" lang="PT-BR"&gt;&lt;i&gt;         &lt;/i&gt;&lt;/span&gt;&lt;span style="color:rgb(204,0,0);" lang="PT-BR"&gt;&lt;i&gt;         &lt;/i&gt;&lt;/span&gt;&lt;span style="color:rgb(204,0,0);" lang="PT-BR"&gt;&lt;i&gt;         echo( "Ola Mundo" );&lt;/i&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="color:rgb(204,0,0);" lang="PT-BR"&gt;&lt;i&gt;         &lt;/i&gt;&lt;/span&gt;&lt;span lang="PT-BR"&gt;&lt;i&gt;&lt;span style="color:rgb(204,0,0);"&gt;     }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:rgb(204,0,0);"&gt; }&lt;/span&gt;&lt;br /&gt;&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;Analisando a classe acima, podemos perceber que: ela se chama OlaMundo e tem um m&#233;todo chamado imprime() que cospe na tela o texto. N&#227;o adianta voc&#234; escrever algo parecido com o seguinte:&lt;br /&gt;&lt;br /&gt;&lt;i&gt;OlaMundo(imprime());&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;Ao tentar fazer isso (leia-se besteira) voc&#234; ter&#225; um erro catastr&#243;fico de sintaxe. Voc&#234; precisa iniciar o seu objeto, utilizando a classe OlaMundo como base para esse objeto. Para isso voc&#234; utilizar&#225; o construtor &lt;b&gt;&lt;i&gt;new&lt;/i&gt;&lt;/b&gt;, que cria um objeto no formato que voc&#234; construiu sua classe. Veja o exemplo da utiliza&#231;&#227;o da classe acima.&lt;br /&gt;&lt;br /&gt;&lt;span style="color:rgb(204,0,0);"&gt; $ObjetoOlaMundo = new OlaMundo();&lt;/span&gt;&lt;br /&gt;&lt;span style="color:rgb(204,0,0);"&gt; $ObjetoOlaMundo-&amp;gt;Imprime();&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Ooooopa.... pera&#237;, acaba de surgir um camarada novo em cena. Trata-se da seta ( &lt;b&gt;-&amp;gt;&lt;/b&gt; ). Sinceramente, n&#227;o fa&#231;o a m&#237;nima id&#233;ia da onde Andi Gutmans tirou essa id&#233;ia de que a seta era mais pr&#225;tica ou tornava o c&#243;digo leg&#237;vel. Bom, mas ela existe e n&#227;o pode ser ignorada. Essa seta serve para separar o objeto (a direta) da chamada de algum m&#233;todo ou atributo (&#224; esquerda). A ordem &#233; sempre a seguinte: $ (cifr&#227;o) nomeDoObjeto (objeto) -&amp;gt; (seta) chamadaDeAlgumaCoisa ( m&#233;todo ou atributo ). Em outras linguagens ( 99.9% das outras que tenha OO) a separa&#231;&#227;o &#233; feita n&#227;o com seta, mas sim com ponto. Algo como $nomeDoObjeto.chamadaDeAlgumaCoisa.&lt;br /&gt;&lt;br /&gt;Voltando ao exemplo do OlaMundo,  veja que voc&#234; criou um objeto chamado $ObjetoOlaMundo que &#233; uma inst&#226;ncia da classe OlaMundo(). Esse objeto agora pode utilizar todos os m&#233;todos ou atributos p&#250;blicos da classe OlaMundo.&lt;br /&gt;&lt;br /&gt;E quanto aos atributos, o que s&#227;o ? Bom, eles s&#227;o elementos que juntamente com os m&#233;todos, definem a estrutura de uma classe. Tamb&#233;m chamados de vari&#225;veis de classe, eles s&#227;o nada mais que uma esp&#233;cie de "vari&#225;veis" onde s&#227;o guardadas informa&#231;&#245;es dentro da classe. Bom, &#233; dif&#237;cil ser simples demais sem pular v&#225;rios conceitos, mas, A PRINCIPIO entenda atributos como um padr&#227;o para entrada de informa&#231;&#227;o na classe. Vamos aprimorar a classe acima ? Al&#233;m do Ola Mundo, vamos escrever o nome do usu&#225;rio.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;i&gt;class OlaMundo{&lt;br /&gt;&lt;/i&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color:rgb(204,0,0);" lang="PT-BR"&gt;&lt;i&gt;         &lt;/i&gt;&lt;/span&gt;&lt;span style="color:rgb(204,0,0);" lang="PT-BR"&gt;    var $nomeDoUsuario;&lt;br /&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/span&gt;&lt;span style="color:rgb(204,0,0);" lang="PT-BR"&gt;&lt;i&gt;         &lt;/i&gt;&lt;/span&gt;&lt;span style="color:rgb(204,0,0);" lang="PT-BR"&gt;&lt;i&gt;     /**&lt;br /&gt;&lt;/i&gt;&lt;/span&gt;&lt;span style="color:rgb(204,0,0);" lang="PT-BR"&gt;&lt;i&gt;         &lt;/i&gt;&lt;/span&gt;&lt;span style="color:rgb(204,0,0);" lang="PT-BR"&gt;&lt;i&gt;      * Escreve Ola Mundo&lt;br /&gt;&lt;/i&gt;&lt;/span&gt;&lt;span style="color:rgb(204,0,0);" lang="PT-BR"&gt;&lt;i&gt;         &lt;/i&gt;&lt;/span&gt;&lt;span style="color:rgb(204,0,0);" lang="PT-BR"&gt;&lt;i&gt;      *&lt;br /&gt;&lt;/i&gt;&lt;/span&gt;&lt;span style="color:rgb(204,0,0);" lang="PT-BR"&gt;&lt;i&gt;         &lt;/i&gt;&lt;/span&gt;&lt;span style="color:rgb(204,0,0);" lang="PT-BR"&gt;&lt;i&gt;      * @author            Chuck Norris.&lt;br /&gt;&lt;/i&gt;&lt;/span&gt;&lt;span style="color:rgb(204,0,0);" lang="PT-BR"&gt;&lt;i&gt;         &lt;/i&gt;&lt;/span&gt;&lt;span style="color:rgb(204,0,0);" lang="PT-BR"&gt;&lt;i&gt;      */&lt;br /&gt;&lt;/i&gt;&lt;/span&gt;&lt;span style="color:rgb(204,0,0);" lang="PT-BR"&gt;&lt;i&gt;         &lt;/i&gt;&lt;/span&gt;&lt;span style="color:rgb(204,0,0);" lang="PT-BR"&gt;&lt;i&gt;     function imprime(){&lt;br /&gt;&lt;br /&gt;&lt;/i&gt;&lt;/span&gt;&lt;span style="color:rgb(204,0,0);" lang="PT-BR"&gt;&lt;i&gt;         &lt;/i&gt;&lt;/span&gt;&lt;span style="color:rgb(204,0,0);" lang="PT-BR"&gt;&lt;i&gt;         &lt;/i&gt;&lt;/span&gt;&lt;span style="color:rgb(204,0,0);" lang="PT-BR"&gt;&lt;i&gt;         echo( "Ola Mundo e ola " . $this-&amp;gt;nomeDoUsuario );&lt;br /&gt;&lt;br /&gt;&lt;/i&gt;&lt;/span&gt;&lt;span style="color:rgb(204,0,0);" lang="PT-BR"&gt;&lt;i&gt;         &lt;/i&gt;&lt;/span&gt;&lt;span style="color:rgb(204,0,0);" lang="PT-BR"&gt;&lt;i&gt;     }&lt;br /&gt;}&lt;/i&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span lang="PT-BR"&gt;&lt;br /&gt;&lt;span style="color:silver;"&gt;&lt;br /&gt;&lt;/span&gt;Ooooopa (novamente) .... Que hist&#243;ria &#233; essa de $nomeDoUsuario l&#225; em cima ????  E que $this &#233; esse no echo ? Simples: se lembra que foi dito que atributos s&#227;o chamados tamb&#233;m de vari&#225;veis de classe ? Pois bem, quando voc&#234; cria uma vari&#225;vel FORA de algum m&#233;todo, essa vari&#225;vel ser torna automaticamente um atributo. Logo, o valor que estiver dentro do atributo $nomeDoUsuario poder&#225; ser acessado por qualquer m&#233;todo da classe. O que eu fiz no echo do m&#233;todo imprime() foi justamente acessar o atributo criado.&lt;br /&gt;&lt;br /&gt;Ah, quanto ao $this,
 o conceito dele &#233; um pouco mais complexo. Para simplificar, entenda que voc&#234; necessita utiliz&#225;-lo toda vez que quiser chamar um atributo ou m&#233;todo dentro da mesma classe. No exemplo acima, eu utilizei o $this para alcan&#231;ar o atributo nomeDoUsuario. Quando queremos chamar outros m&#233;todos pertencentes &#224; mesma classe, n&#243;s tamb&#233;m utilizamos o $this. Para voc&#234; utilizar a classe acima, atribuindo um nome qualquer no atributo, basta somente voc&#234; fazer o seguinte:&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span lang="PT-BR"&gt;&lt;br /&gt;&lt;span style="color:rgb(204,0,0);"&gt; $ObjetoOlaMundo = new OlaMundo();&lt;/span&gt;&lt;br /&gt;&lt;span style="color:rgb(204,0,0);"&gt;$ObjetoOlaMundo-&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color:rgb(204,0,0);" lang="PT-BR"&gt;&lt;span style="color:rgb(204,0,0);"&gt;nomeDoUsuario = "Jeremias";&lt;/span&gt;&lt;br /&gt;$ObjetoOlaMundo-&amp;gt;Imprime();&lt;/span&gt;&lt;br /&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;b&gt;Observa&#231;&#245;es Finais.&lt;/b&gt;&lt;br /&gt;&lt;/p&gt;Bom, por enquanto &#233; isso. Acho que para um post eu passei bastante conte&#250;do. Eu tinha em mente passar modificadores de acesso( public, private e protected), o uso de heran&#231;as e polimorfismo no mesmo post, mas, acredito que vai ficar puxado para aqueles que est&#227;o vendo isso pela primeira vez. Vou criar um post futuro s&#243; com exemplos e depois continuamos. Minha meta &#233; chegarmos o quanto antes em UML.&lt;br /&gt;&lt;p class="MsoNormal"&gt;&lt;span lang="PT-BR"&gt;&lt;br /&gt;Links interessantes para voc&#234; j&#225; ir lendo:&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span lang="PT-BR"&gt;Centro de Computa&#231;&#227;o da UNICAMP: http://www.ccuec.unicamp.br/revista/infotec/artigos/leite_rahal.html&lt;br /&gt;Fernando Lozano, consultor independente: http://www.lozano.eti.br/palestras/oo-php.pdf&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;Se tiver alguma d&#250;vida sobre o que j&#225; foi explicado, use os coment&#225;rios.&lt;br /&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span lang="PT-BR"&gt;&lt;br /&gt;Um abra&#231;o e sorte nos estudos.&lt;br /&gt;&lt;/span&gt;Pedro Mendes&lt;/p&gt;</description>
      <guid>/</guid>
    </item>
    <item>
      <title>Simulando um With no PHP com Interfaces Fluentes</title>
      <link>http://www.blogdopedro.net/2008/05/21/simulando-um-with-no-php-com-interfaces-fluentes</link>
      <description>Esses dias estava conversando com um grande colega programador sobre a car&#234;ncia do comando With no PHP.  Estive procurando por algum tempo e como n&#227;o tive uma solu&#231;&#227;o que me agradasse joguei a id&#233;ia para o limbo.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;At&#233; que ontem, em mais uma das minhas noites de ins&#244;nia, tive a id&#233;ia de simular o comando With com umas das melhores pr&#225;ticas de legibilidade de c&#243;digo: Fluents Interfaces, ou Interfaces Fluentes.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Primeiro Passo: Falando de Fluents Interfaces e PHP&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Acredito que para muitos o termo "Interfaces Fluentes"  n&#227;o &#233; novidade alguma. Mas, para quem n&#227;o conhece, trata-se de uma maneira mais intuitiva de construir suas classes. Como a implementa&#231;&#227;o de POO no PHP4 era deficiente (leia-se prec&#225;ria) n&#227;o era poss&#237;vel a pr&#225;tica de Interfaces Fluentes gra&#231;as &#224;  seguinte limita&#231;&#227;o: no PHP4 voc&#234; n&#227;o consegue criar uma refer&#234;ncia direta ao objeto atrav&#233;s do retorno dos seus pr&#243;prios m&#233;todos.&lt;br /&gt;&lt;br /&gt;Mas no PHP5 e sua OO totalmente reescrita, eis que tudo (ou quase) se fez novo. Agora, como a defici&#234;ncia acima foi suprida, podemos facilmente fazer referencia direta ao objeto retornado por um dos seus pr&#243;prios m&#233;todos.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Exemplo:&lt;br /&gt;&lt;br /&gt;&lt;span style="color:rgb(204,0,0);"&gt;// Classe que retorna a pr&#243;pria referencia em todos os m&#233;todos&lt;/span&gt;&lt;br /&gt;&lt;span style="color:rgb(204,0,0);"&gt;class escreveONomeCompletoUsandoInterfaceFluente {&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:rgb(204,0,0);"&gt;    public function escreveNome( $str ) {&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:rgb(204,0,0);"&gt;        &lt;/span&gt;&lt;br /&gt;&lt;span style="color:rgb(204,0,0);"&gt;        // Escreve um nome qualquer&lt;/span&gt;&lt;br /&gt;&lt;span style="color:rgb(204,0,0);"&gt;        echo( $str );&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:rgb(204,0,0);"&gt;        &lt;/span&gt;&lt;br /&gt;&lt;span style="color:rgb(204,0,0);"&gt;        // Retorna a referencia do pr&#243;prio objeto&lt;/span&gt;&lt;br /&gt;&lt;span style="color:rgb(204,0,0);"&gt;        return $this;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:rgb(204,0,0);"&gt;    }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:rgb(204,0,0);"&gt;    public function escreveSobreNome( $str ) {&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:rgb(204,0,0);"&gt;        &lt;/span&gt;&lt;br /&gt;&lt;span style="color:rgb(204,0,0);"&gt;        // Escreve um sobrenome qualquer&lt;/span&gt;&lt;br /&gt;&lt;span style="color:rgb(204,0,0);"&gt;        echo( $str );&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:rgb(204,0,0);"&gt;        &lt;/span&gt;&lt;br /&gt;&lt;span style="color:rgb(204,0,0);"&gt;        // Retorna referencia ao pr&#243;prio objeto&lt;/span&gt;&lt;br /&gt;&lt;span style="color:rgb(204,0,0);"&gt;        return $this;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:rgb(204,0,0);"&gt;    }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:rgb(204,0,0);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Ao ler a classe de exemplo acima, voc&#234; notar&#225; que eu sempre retorno o pr&#243;prio objeto. Pois bem imaginemos uma possivel utiliza&#231;&#227;o NORMAL da classe acima:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:rgb(204,0,0);"&gt;$escreveNomeCompleto = new escreveONomeCompletoUsandoInterfaceFluente();&lt;/span&gt;&lt;br /&gt;&lt;span style="color:rgb(204,0,0);"&gt;$escreveNomeCompleto-&amp;gt;escreveNome( &#8216; Pedro &#8216; );&lt;/span&gt;&lt;br /&gt;&lt;span style="color:rgb(204,0,0);"&gt;$escreveNomeCompleto-&amp;gt;escreveSobreNome( &#8216; Mendes &#8216; );&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Por&#233;m, como eu estou  retornando o pr&#243;prio objeto nos m&#233;todos da classe criada, a implementa&#231;&#227;o Fluente do c&#243;digo seria a seguinte:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:rgb(204,0,0);"&gt;$escreveNomeCompleto = new escreveONomeCompletoUsandoInterfaceFluente();&lt;/span&gt;&lt;br /&gt;&lt;span style="color:rgb(204,0,0);"&gt;$escreveNomeCompleto-&amp;gt;escreveNome( &#8216; Pedro &#8216; )-&amp;gt;escreveSobreNome( &#8216; Mende&lt;/span&gt;s &#8216; );&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Desta forma, esta criada uma implementa&#231;&#227;o simples das Fluents Interfaces no PHP. Como voc&#234; pode perceber, a id&#233;ia central &#233; voc&#234; encadear  a chamada dos seus m&#233;todos da seguinte forma: $objeto-&amp;gt;metodo1()-&amp;gt;metodo2()-&amp;gt;metodo3()-&amp;gt;&#8230;-&amp;gt;metodofinal(); ao inv&#233;s de ficar chamando o objeto a cada vez que voc&#234; queira chamar um m&#233;todo.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Segundo Passo: Aplicando o conceito de Fluents Interfaces para alcan&#231;ar o conceito de With&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Em algumas linguagens voc&#234; tem o comando With, que funcionada da seguinte forma:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:rgb(204,0,0);"&gt;With instanciaDoObjeto&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:rgb(204,0,0);"&gt;    metodoUm();&lt;/span&gt;&lt;br /&gt;&lt;span style="color:rgb(204,0,0);"&gt;    metodoDois();&lt;/span&gt;&lt;br /&gt;&lt;span style="color:rgb(204,0,0);"&gt;    metodoTres();&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:rgb(204,0,0);"&gt;End With;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Com isso, voc&#234; fornece a inst&#226;ncia do objeto e simplesmente trabalha com seus atributos e/ou m&#233;todos dentro do bloco criado, diminuindo o c&#243;digo a ser escrito e deixando-o mais limpo. No PHP eu n&#227;o achei nada que criasse o With diretamente, mas com o conceito de Interfaces Fluentes, o mesmo c&#243;digo acima poderia ficar da seguinte forma:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:rgb(204,0,0);"&gt;$instanciaDoObjeto&lt;/span&gt;&lt;br /&gt;&lt;span style="color:rgb(204,0,0);"&gt;    -&amp;gt;metodoUm();&lt;/span&gt;&lt;br /&gt;&lt;span style="color:rgb(204,0,0);"&gt;    -&amp;gt;metodoDois();&lt;/span&gt;&lt;br /&gt;&lt;span style="color:rgb(204,0,0);"&gt;    -&amp;gt;metodoTres();&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Pronto! Esta criado o conceito do With com uma estrutura mais aprimorada. Espero que tenham gostado e enviem suas duvidas/criticas/sujest&#245;es.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Um abra&#231;o,&lt;br /&gt;Pedro Mendes</description>
      <guid>/</guid>
    </item>
    <item>
      <title>Palestra de JQuery com uma crian&#231;a</title>
      <link>http://www.blogdopedro.net/0008/10/23/palestra-de-jquery-com-uma-crianca</link>
      <description>Pois &#233;, eu ontem ficando mais velho e o pessoal aqui da empresa me passa um v&#237;deo de um garotinho de 12 anos dando uma palestra de Jquery. Pelo menos dessa vez n&#227;o foi o &lt;a href="http://www.dx7lab.com/"&gt;Rafael dx7&lt;/a&gt; que acabou com a minha vida, foi o &lt;a href="http://www.escadologia.com/"&gt;Rafael Peixe&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;[youtube=http://www.youtube.com/watch?v=8mwKq7_JlS8&amp;hl=pt-br&amp;fs=1]</description>
      <guid>/</guid>
    </item>
  </channel>
</rss>
