<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Juliano Ribeiro &#187; Programação</title>
	<atom:link href="http://julianoribeiro.com.br/blog/tag/programacao/feed/" rel="self" type="application/rss+xml" />
	<link>http://julianoribeiro.com.br/blog</link>
	<description>Development and Design</description>
	<lastBuildDate>Tue, 31 Jan 2012 11:40:50 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>Padrão Builder com Delphi</title>
		<link>http://julianoribeiro.com.br/blog/padrao-builder-com-delphi/</link>
		<comments>http://julianoribeiro.com.br/blog/padrao-builder-com-delphi/#comments</comments>
		<pubDate>Wed, 06 Oct 2010 18:58:36 +0000</pubDate>
		<dc:creator>Juliano Ribeiro</dc:creator>
				<category><![CDATA[Delphi]]></category>
		<category><![CDATA[Orientação à Objetos]]></category>
		<category><![CDATA[Pessoal]]></category>
		<category><![CDATA[SQL]]></category>
		<category><![CDATA[Builder]]></category>
		<category><![CDATA[Design Patterns]]></category>
		<category><![CDATA[Orientação à Objeto]]></category>
		<category><![CDATA[Padrão de Projetos]]></category>
		<category><![CDATA[POO]]></category>
		<category><![CDATA[Programação]]></category>

		<guid isPermaLink="false">http://julianoribeiro.com.br/blog/?p=431</guid>
		<description><![CDATA[Voltando a falar de programação, hoje vamos continuar a falar da orientação à objetos dentro do Delphi. Apesar de estar estudando Java já tem algum tempo, eu trabalho com Delphi desde de sua versão 2.0, então fica bem difícil não querer aplicar tudo o que aprendi sobre o assunto na linguagem que tenho mais afinidade. [...]]]></description>
			<content:encoded><![CDATA[<p>Voltando a falar de programação, hoje vamos continuar a falar da orientação à objetos dentro do Delphi. Apesar de estar estudando Java já tem algum tempo, eu trabalho com Delphi desde de sua versão 2.0, então fica bem difícil não querer aplicar tudo o que aprendi sobre o assunto na linguagem que tenho mais afinidade.<br />
<span id="more-431"></span><br />
O padrão de projeto <strong>Builder</strong>, nada mais é que um construtor especializado, que executa determinadas ações sempre que precisa construir um novo objeto. Vamos imaginar, por exemplo, que você criou em sua classe de serviços, um método <strong>getItemById</strong>, que tem como parâmetro óbvio o <strong>ID</strong> e retorna um objeto da classe referenciada. Digamos que seria um código semelhante à esse:</p>
<pre class="brush: delphi;">
function TServicoMinhaClasse.getMinhaClasseById(Id: Integer): TMinhaClasse;
var
   cls: TMinhaClasse;
begin
   cls := TMinhaClasse.Create;
   Result := cls;
end;
</pre>
<p>Esse seria um código legal, se a classe não tivesse atributos. Para piorar esses dados ficam guardados em banco de dados. Portanto, eu preciso criar a conexão (ou usar uma existente) e criar uma nova consulta ao banco, configurando o banco. Para o nosso exemplo, vamos imaginar que a MinhaClasse tenha código e descrição somente. O código da unit da classe ficaria como o abaixo:</p>
<pre class="brush: delphi;">
unit unMinhaClasse;

interface

type
   TMinhaClasse = class(TObject)

   private
      FDescricao: String;
      FID: Integer;
      procedure SetID(const Value: Integer);
      procedure SetDescricao(const Value: String);
   public
      property ID: Integer read FID write SetID;
      property Descricao: String read FDescricao write SetDescricao;
   end;

implementation

{ TMinhaClasse }

procedure TMinhaClasse.SetID(const Value: Integer);
begin
  FID := Value;
end;

procedure TMinhaClasse.SetDescricao(const Value: String);
begin
  FDescricao := Value;
end;

end.
</pre>
<p>Assim, para preencher essas propriedades, vamos modificar o corpo da nossa função para algo assim:</p>
<pre class="brush: delphi;">
(...)
var
   qry: TSQLQuery;
begin
   cls := TMinhaClasse.Create;

   qry := TSQLQuery.Create;

   try
      qry.Database    := dModule.Database;
      qry.Transaction := dModule.Transaction;
      qry.SQL.Add('select * from tabela where id = :id');
      qry.ParamByName('id').AsInteger := Id;
      qry.Open;

      if not qry.IsEmpty then
      begin
         cls.ID        := qry.FieldByName('id').AsInteger;
         cls.Descricao := qry.FieldByName('descricao').AsString;
      end
      else
      begin
         cls := nil;
      end;
   finally
      qry.Free;
   end;

   Result := cls;
end;</pre>
<p>Ok, ficou bom, mas imagine a longo prazo. Para cada uma das vezes que eu precisar da classe, eu teria de criar uma nova instância de SQLQuery e configura-la. Isso pode (e quase sempre vai) me induzir a errar em algum momento, na hora que eu esquecer de passar algum parâmetro ou mesmo validar se o banco está conectado. Para evitar todos esses problemas, criaremos um Builder, que para nós será simplesmente um construtor melhor para nossa SQLQuery.</p>
<p>Esse construtor vai ser instanciado dentro do objeto de serviço que  e será vinculado à esse. Assim, todas as querys serão filhas desse objeto e serão destruídas quando esse for. Nesse builder vou precisar de duas propriedades: BancoDeDados e Transação. Assim, no construtor desse meu builder eu já as preencho e garanto que todos as querys ali criadas saem já configuradas como deve ser.</p>
<p>Desse jeito, a classe builder fica assim:</p>
<pre class="brush: delphi;">
unit unQueryBuilder;

interface

uses
  SysUtils, Classes, SqlExpr, DBXpress;

type
   TQueryBuilder = class(TObject)
   private
      FTransacao: TTransactionDesc;
      FBancoDeDados: TSQLConnection;
      procedure SetBancoDeDados(const Value: TSQLConnection);
      procedure SetTransacao(const Value: TTransactionDesc);
   public
      property BancoDeDados: TSQLConnection read FBancoDeDados write SetBancoDeDados;
      property Transacao: TTransactionDesc read FTransacao write SetTransacao;
      function NovaInstancia(Dono: TComponent): TSQLQuery;
      constructor Create(Base: TSQLConnection; Trans: TTransactionDesc);
   end;

implementation

{ TQueryBuilder }

constructor TQueryBuilder.Create(Base: TSQLConnection; Trans: TTransactionDesc);
begin
   Self.BancoDeDados := Base;
   Self.Transacao := Trans;
end;

function TQueryBuilder.NovaInstancia(Dono: TComponent): TSQLQuery;
var
   pdsNovo: TSQLQuery;
begin
   pdsNovo := TSQLQuery.Create(Dono);
   pdsNovo.Database    := Self.BancoDeDados;
   pdsNovo.Transaction := Self.Transacao;
   Result := pdsNovo;
end;

procedure TQueryBuilder.SetBancoDeDados(const Value: TSQLConnection);
begin
   FBancoDeDados := Value;
end;

procedure TQueryBuilder.SetTransacao(const Value: TTransactionDesc);
begin
   FTransacao := Value;
end;

end.</pre>
<p>Assim, toda vez que instanciar o novo serviço, devemos criar uma variável (ou propriedade) que armazene esse objeto Builder, mais ou menos assim:</p>
<pre class="brush: delphi;">   FabricaQuery := TQueryFactory.Create(Base, Trans);</pre>
<p>Refatorando a chamada da função, teremos isso:</p>
<pre class="brush: delphi;">
function TServicoMinhaClasse.getMinhaClasseById(Id: Integer): TMinhaClasse;
var
   qry: TSQLQuery;
   cls: TMinhaClasse;
begin
   qry := FabricaQuery.NovaInstancia(nil);

   try
      qry.SQL.Add('select * from tabela where id = :id');
      qry.ParamByName('id').AsInteger := Id;
      qry.Open;

      if not qry.IsEmpty then
      begin
         cls.ID        := qry.FieldByName('id').AsInteger;
         cls.Descricao := qry.FieldByName('descricao').AsString;
      end
      else
      begin
         cls := nil;
      end;
   finally
      qry.Free;
   end;

   result := cls;
end;</pre>
<p>Talvez ainda tenha muito mais a melhorar, mas já está melhor do que inicial. Embora, aparentemente, o ganho tenha sido pouco, a vantagem desse padrão só seria sentida se não o utilizássemos. As propriedades poderiam ser preenchidas incorretamente e mais validações poderiam deixar de ser executadas. Dá para aprimorar muito mais. Mas eu vou até aqui, o resto deixo com vocês.</p>
<blockquote><p>Pessoal, esse código pode gerar alguns erros. Ele foi originalmente escrito para a empresa que trabalho e por isso, muito do que era usado aqui foi substituído por componentes genéricos.</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://julianoribeiro.com.br/blog/padrao-builder-com-delphi/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Porque não programamos em casa?</title>
		<link>http://julianoribeiro.com.br/blog/porque-nao-programamos-em-casa/</link>
		<comments>http://julianoribeiro.com.br/blog/porque-nao-programamos-em-casa/#comments</comments>
		<pubDate>Mon, 23 Aug 2010 13:37:33 +0000</pubDate>
		<dc:creator>Juliano Ribeiro</dc:creator>
				<category><![CDATA[Artigos]]></category>
		<category><![CDATA[Desenvolvimento]]></category>
		<category><![CDATA[Cotidiano]]></category>
		<category><![CDATA[Programação]]></category>

		<guid isPermaLink="false">http://julianoribeiro.com.br/blog/?p=321</guid>
		<description><![CDATA[]]></description>
			<content:encoded><![CDATA[<p><a href="http://julianoribeiro.com.br/blog/wp-content/uploads/2010/08/tirinha1369.gif"><img class="aligncenter size-full wp-image-320" title="tirinha1369" src="http://julianoribeiro.com.br/blog/wp-content/uploads/2010/08/tirinha1369.gif" alt="" width="509" height="162" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://julianoribeiro.com.br/blog/porque-nao-programamos-em-casa/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Delphi orientado à objetos &#8211; parte 1</title>
		<link>http://julianoribeiro.com.br/blog/delphi-orientado-a-objetos-parte-01/</link>
		<comments>http://julianoribeiro.com.br/blog/delphi-orientado-a-objetos-parte-01/#comments</comments>
		<pubDate>Tue, 27 Jul 2010 13:47:20 +0000</pubDate>
		<dc:creator>Juliano Ribeiro</dc:creator>
				<category><![CDATA[Artigos]]></category>
		<category><![CDATA[Delphi]]></category>
		<category><![CDATA[Desenvolvimento]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Artigo]]></category>
		<category><![CDATA[Programação]]></category>

		<guid isPermaLink="false">http://julianoribeiro.com.br/blog/?p=293</guid>
		<description><![CDATA[Já tem um bom tempo que programo com Delphi. E sempre ouvi críticas pesadíssimas sobre o quanto a linguagem é ruim. Eu sempre acreditei que existiram sempre programadores ruins e que os programas saiam ruins, o que gerou essa impressão negativa, bem como os vários problemas que a Borland (fabricante do Delphi, agora CodeGear) impôs [...]]]></description>
			<content:encoded><![CDATA[<p>Já tem um bom tempo que programo com Delphi. E sempre ouvi críticas pesadíssimas sobre o quanto a linguagem é ruim. Eu sempre acreditei que existiram sempre programadores ruins e que os programas saiam ruins, o que gerou essa impressão negativa, bem como os vários problemas que a <strong>Borland </strong>(fabricante do Delphi, agora <strong>CodeGear</strong>) impôs nas mudanças de versão. Assim, resolvi desmistificar essa coisa de que é impossível programar orientado à objetos usando o Delphi.</p>
<p>Segue o material do nosso último treinamento, sobre como usar o Delphi, orientado à objetos.<br />
Embora pareça que estamos trabalhando com OO desde sempre, afinal instanciamos objetos baseados em classes, isso não é inteiramente verdade.<br />
Como me disse um professor certa vez: <em>&#8220;Seu sistema é orientado à objetos? Ótimo. Me mostre a sua classe NotaFiscalSaída.&#8221;</em></p>
<p>Assim achei por bem usar um exemplo bem simples, estados e cidades para mostrar o poder que o Delphi tem e de quebra demonstrar que o que está errada é a maneira como programamos e não a linguagem que usamos, seja ela qual for.<br />
<span id="more-293"></span><br />
Primeiramente, começamos com alguns paralelos. No Delphi, para criarmos uma classe, precisamos cria-la como um componente, para mais tarde, criar instancias dele. Usando o <strong>Delphi 2006</strong>, eu vou em <em><strong>File > New > Package</strong></em>. Então no Project Manager eu clico sobre o pacote com o botão direito e escolho <em><strong>Add New > Other&#8230;</strong></em></p>
<p>A janela que se abrirá me dá várias opções, a que vamos usar está em<em> <strong>Delphi Projects > Delphi Files > Component</strong></em>. No Wizard seguinte escolhemos de qual componente o nosso irá herdar suas características (não vou explicar herança aqui). Nesse momento escolheremos <strong>TComponent</strong>, para pegar somente o mínimo necessário. Na próxima tela, escolha o nome do componente em C<strong>lass Name</strong>, para nós será TCidade (o &#8220;T&#8221; é padrão do Delphi, use sem questionar). Escolha a Pallete Page que deseja ou digite uma nova, lembre que esse campo é Case Sensitive, portanto atenção ao digitar. Preencha os demais campos se precisar.</p>
<p>A classe cidade:</p>
<pre class="brush: delphi;">
unit cidade;

interface

uses
  SysUtils, Classes, Estado;

type
  TCidade = class(TComponent)
  private
    Fcid_nome: string;
    Fcid_codigo: integer;
    Festado: TEstado;
    procedure Setcid_codigo(const Value: integer);
    procedure Setcid_nome(const Value: string);
    procedure Setestado(const Value: TEstado);
    { Private declarations }
  protected
    { Protected declarations }
  public
    { Public declarations }
  published
    { Published declarations }
    property cid_codigo: integer read Fcid_codigo write Setcid_codigo;
    property cid_nome: string read Fcid_nome write Setcid_nome;
    property estado: TEstado read Festado write Setestado;
  end;

procedure Register;

implementation

procedure Register;
begin
  RegisterComponents('Objetos Produtec', [TCidade]);
end;

{ TCidade }

procedure TCidade.Setcid_codigo(const Value: integer);
begin
  Fcid_codigo := Value;
end;

procedure TCidade.Setcid_nome(const Value: string);
begin
  Fcid_nome := Value;
end;

procedure TCidade.Setestado(const Value: TEstado);
begin
  Festado := Value;
end;

end.</pre>
<p>Vamos falar um pouco da classe cidade. Nela eu coloquei os principais atributos de uma cidade, somente para exemplo. Percebam que os mesmos foram criados baseado na seguinte estrutura: </p>
<pre class="brush: delphi;">
private
    Fcid_nome: string;
published
    property cid_nome: string read Fcid_nome write Setcid_nome;
</pre>
<p>(&#8230;)</p>
<pre class="brush: delphi;">
procedure TCidade.Setcid_nome(const Value: string);
begin
  Fcid_nome := Value;
end;
</pre>
<p>Traduzindo, teremos uma propriedade com o nome cid_nome, do tipo string (notem que sem tamanho definido) que lê o valor para uma variável Fcid_nome e grava através de uma procedure chamada como Setcid_nome. Ótimo, mas o que ganhamos com isso? Para que esconder o real valor de uma variável ao invés de simplesmente torná-la pública? E para que criar um procedimento para atribuir o valor, se a mudança da visibilidade já resolveria? Parece tudo uma grande perda de tempo, mas é um foco na segurança e no reuso.<br />
Imaginem que em determinado momento, nós precisaremos delimitar o tamanho da cidade para o máximo de caracteres que existem no banco de dados, que para o nosso exemplo é de 60 caracteres. Alterando o procedimento SetCid_Nome todo, eu disse TODO, o sistema passa a respeitar a nova regra, sem precisar avisar a nenhuma outra parte do sistema que isso aconteceu. Vejam como ficaria: </p>
<pre class="brush: delphi;">
procedure TCidade.Setcid_nome(const Value: string);
begin
   if Length(Value) &lt; 60 then
      Fcid_nome := Value;
end;
</pre>
<p>Viram que simples? Poderíamos melhorar ainda, criando uma mensagem de erro (exceção) que poderia ser tratada pela tela que realizou a chamada ou simplesmente exibida diretamente em tela. Algo mais ou menos assim: </p>
<pre class="brush: delphi;">
procedure TCidade.Setcid_nome(const Value: string);
begin
   if Length(Value) &lt; 60 then
      Fcid_nome := Value
   else
      raise Exception.Create('O nome da cidade não pode conter mais do que 60 caracteres.');
end;
</pre>
<p>Várias validações ou procedimentos poderiam ser feitos no momento em que a propriedade é atribuída, como preencher uma outra propriedade, carregar outros componentes em tela, enfim, o limite fica por conta da necessidade do programador.<br />
Se eu não disse antes, o nome desse método chama-se <a href="http://pt.wikipedia.org/wiki/Encapsulamento">encapsulamento</a>, pois os atributos ficam protegidos (encapsulados) em métodos que lêem e escrevem nas variáveis.<br />
Isso é meio caminho para um estereótipo usado em UML chamado JavaBean, que os meninos que mexem com Java devem conhecer bem.</p>
]]></content:encoded>
			<wfw:commentRss>http://julianoribeiro.com.br/blog/delphi-orientado-a-objetos-parte-01/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>O que a faculdade faz?</title>
		<link>http://julianoribeiro.com.br/blog/o-que-a-faculdade-faz/</link>
		<comments>http://julianoribeiro.com.br/blog/o-que-a-faculdade-faz/#comments</comments>
		<pubDate>Wed, 06 May 2009 13:21:05 +0000</pubDate>
		<dc:creator>Juliano Ribeiro</dc:creator>
				<category><![CDATA[Artigos]]></category>
		<category><![CDATA[Desenvolvimento]]></category>
		<category><![CDATA[Faculdade]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[Aprendizado]]></category>
		<category><![CDATA[Ensino]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[Web Design]]></category>

		<guid isPermaLink="false">http://julianoribeiro.com.br/blog/?p=149</guid>
		<description><![CDATA[Não sei se eu comentei por aqui, mas eu faço faculdade de Sistemas para a Internet, no CESUMAR, aqui em Maringá. É um curso ótimo que ajuda a desenvolver as habilidades para fazer sistemas online. Reparem na palavra, &#8220;AJUDA&#8221;. Você tem um custo, perde seu tempo e não vai sair da faculdade sabendo fazendo nem [...]]]></description>
			<content:encoded><![CDATA[<p>Não sei se eu comentei por aqui, mas eu faço faculdade de Sistemas para a Internet, no CESUMAR, aqui em Maringá. É um curso ótimo que ajuda a desenvolver as habilidades para fazer sistemas online. Reparem na palavra, <strong>&#8220;AJUDA&#8221;.</strong> Você tem um custo, perde seu tempo e não vai sair da faculdade sabendo fazendo nem um site se não correr atrás.</p>
<p>Ai você me pergunta:</p>
<blockquote><p>Pô Juliano, então você está me dizendo que eu to jogando meu dinheiro fora? Que se eu quiser realmente aprender vou ter de me virar?</p></blockquote>
<p><span id="more-149"></span></p>
<p>Bom, é e não é. Nesse momento em que estou do curso faço a seguinte avaliação: estamos num curso de programação para a web e o que os alunos mais reclamam é que não conseguem aprender programação. Gente, pelo divino, o curso é de programação. Ou aprendem isso ou saiam. Não estou expulsando ninguém, mas poxa, basta um mínimo de dedicação que a coisa flui. Nós estamos atrasados 3 bimestres com a matéria de PHP. Já deveríamos estar estudando Flex e ainda estamos em Javascript. Isso é completamente inaceitável.</p>
<p>Não estou generalizando. Vi excelentes iniciativas de pessoas que foram atrás, pagaram professores particulares, procuram alunos que saibam programar e conseguem melhorar o seu desempenho. Isso é salutar.</p>
<p>Esse post tem o seguinte intuito. Dar uma sacudida em todos vocês que esperam que a faculdade ensine todas as informações que você precisa para vida profissional.</p>
<p><strong>No pain, no gain.</strong></p>
<p>De outro lado, professores, não perguntem se não querem ouvir a resposta. Ontem um professor deixou um espaço aberto para que os alunos questionassem a prova e ficou furioso com o que ouviu. Mil desculpas, mas você perguntou. Citar referências externas para que alunos que querem se dedicar a isso possam ampliar seus conhecimentos é excelente. Falar que só porque essas referências foram citadas elas são matéria de prova, é ridículo.</p>
<p>Caros professores, temos uma vida fora da faculdade. Não somos máquinas de estudar bem como vocês não são máquinas de ensinar. Não cobre conhecimentos profundos de orientação à objetos se para muitos é a primeira vez que veem isso na vida.</p>
<p>Espero não ter sido muito ofensivo ou irritante, o espaço, como sempre, fica aberto para quem quiser se pronunciar. Abraços</p>
]]></content:encoded>
			<wfw:commentRss>http://julianoribeiro.com.br/blog/o-que-a-faculdade-faz/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Material de Javascript</title>
		<link>http://julianoribeiro.com.br/blog/material-de-javascript/</link>
		<comments>http://julianoribeiro.com.br/blog/material-de-javascript/#comments</comments>
		<pubDate>Tue, 05 May 2009 11:40:12 +0000</pubDate>
		<dc:creator>Juliano Ribeiro</dc:creator>
				<category><![CDATA[Faculdade]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[Cesumar]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Programação]]></category>

		<guid isPermaLink="false">http://julianoribeiro.com.br/blog/?p=126</guid>
		<description><![CDATA[Bom dia menininhos. Ontem depois de uma aula com o professor que ficou magoado com nossas notas, tivemos uma excelente aula introdutória (ui) sobre JavaScript. Aula interessante e bem básica, para se entender os conceitos fundamentais dessa &#8220;linguagem&#8221;. Nosso querido professor, Ramazotti, disponibilizou alguns materiais na sua área, que eu estou replicando-os aqui. Espero ajudar. [...]]]></description>
			<content:encoded><![CDATA[<p>Bom dia menininhos.</p>
<p>Ontem depois de uma aula com o professor que ficou magoado com nossas notas, tivemos uma excelente aula introdutória (ui) sobre JavaScript. Aula interessante e bem básica, para se entender os conceitos fundamentais dessa &#8220;linguagem&#8221;.</p>
<p>Nosso querido professor, Ramazotti, disponibilizou alguns materiais na sua área, que eu estou replicando-os aqui. Espero ajudar. Parafraseando o <a title="Blog do Rodrigo" href="http://blog.guedesdesouza.com.br/" target="_blank">Rodrigo</a>:</p>
<blockquote><p>programar é gostoso, morrer queimado é melhor ainda.</p></blockquote>
<p style="text-align: center;"><a title="Apostila de Javascript" href="http://www.julianoribeiro.com.br/troca/programacao/JavaScript.pdf">Apostila de Javascript</a> e <a href="http://www.julianoribeiro.com.br/troca/programacao/Prototype.pdf">Apostila de Prototype</a></p>
]]></content:encoded>
			<wfw:commentRss>http://julianoribeiro.com.br/blog/material-de-javascript/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

