<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>Boaglio.com</title>
	
	<link>http://www.boaglio.com</link>
	<description />
	<lastBuildDate>Thu, 03 May 2012 16:22:49 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/boaglio" /><feedburner:info uri="boaglio" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item>
		<title>Nova referência de Java em português</title>
		<link>http://feedproxy.google.com/~r/boaglio/~3/mIo9LFjkjko/</link>
		<comments>http://www.boaglio.com/index.php/2012/05/01/nova-referencia-de-java-em-portugues/#comments</comments>
		<pubDate>Tue, 01 May 2012 16:53:17 +0000</pubDate>
		<dc:creator>Fernando Boaglio</dc:creator>
				<category><![CDATA[Análise de livro]]></category>
		<category><![CDATA[Arquitetura]]></category>
		<category><![CDATA[Engenharia de Software]]></category>
		<category><![CDATA[Java]]></category>

		<guid isPermaLink="false">http://www.boaglio.com/?p=719</guid>
		<description><![CDATA[O mercado Java cresceu traumatizado com as literaturas em português. No meio de traduções bizarras e ter que esperar um mês para o seu livro da Amazon chegar ao Brasil, o profissional se acostumou com isso nas últimas décadas e a reação esperada ao pegar uma literatura é no mínimo uma leve desconfiança do conteúdo. [...]]]></description>
			<content:encoded><![CDATA[<p>O mercado Java cresceu traumatizado com as literaturas em português. No meio de traduções bizarras e ter que esperar um mês para o seu livro da Amazon chegar ao Brasil, o profissional se acostumou com isso nas últimas décadas e a reação esperada ao pegar uma literatura é no mínimo uma leve desconfiança do conteúdo.</p>
<p>Naturalmente eu também fiquei desconfiado, mas como conheço pessoalmente alguns dos <a href="http://www.boaglio.com/go.php?http://www.arquiteturajava.com.br/#autores" title="autores (22 hits)" target="_blank">autores</a>, comprei o livro de <strong><a href="http://www.boaglio.com/go.php?http://www.arquiteturajava.com.br/" target="_blank" title="(22 hits)">Introdução à arquitetura e design de software &#8211; uma visão sobre a plataforma Java</a></strong>.</p>
<p><a href="http://www.boaglio.com/go.php?http://www.boaglio.com/wp-content/uploads/2012/04/capa-livro.png" title="(137 hits)"><img src="http://www.boaglio.com/wp-content/uploads/2012/04/capa-livro.png" alt="" title="capa-livro" width="340" height="500" class="aligncenter size-full wp-image-724" /></a></p>
<p>Para minha surpresa, mesmo para quem tem experiência no assunto, é uma leitura bem agradável e rica em exemplos, dou destaques aos capítulos 2 da <a href="http://www.boaglio.com/go.php?http://www.arquiteturajava.com.br/livro/principios-de-garbage-collection.pdf" title="2 (3 hits)" target="_blank">Java Virtual Machine</a> , o 6 de <a href="http://www.boaglio.com/go.php?http://www.arquiteturajava.com.br/livro/domine-sua-ferramenta-de-mapeamento-objeto-relacional.pdf" title="6 (4 hits)" target="_blank">decisões arquiteturais</a> e o 7 de REST. </p>
<p>Não é nada fácil fazer um livro desse tipo, que envolve diversos conceitos, comparações , assuntos que não são triviais para explicar.</p>
<p>Vou listar alguns <strong>pontos positivos</strong> do livro:</p>
<ul>
<li>objetivo</li>
<li>bem organizado</li>
<li>conteúdo bem atual e com exemplos interessantes</li>
<li><a href="http://www.boaglio.com/go.php?http://www.arquiteturajava.com.br/livro/referencias.pdf" title="Referências (5 hits)" target="_blank">rico repositório de referências</a></li>
<li>interessante <a href="http://www.boaglio.com/go.php?http://www.arquiteturajava.com.br/livro/prefacio.pdf" target="_blank" title="(3 hits)">prefácio de Jim Weber</a></li>
</ul>
<p>Estou com a primeira edição e não vi a segunda, mas acredito que existam alguns <strong>pontos para melhorar</strong>:</p>
<ul>
<li>Diminuir os erros de digitação</li>
<li>Faltou detalhamento da visão geral de performance de um sistema Java</li>
<li>Não encontrei os links para as referências no site que o livro descreve </li>
<li>Faltou um texto sobre ambiente em cluster, o comportamento Java nessa arquitetura</li>
</ul>
<p>Algumas pessoas que leram o livro reclamaram que existe muita referência aos frameworks criados pela Caelum.  Eu não entendo qual o drama disso, afinal os autores são de lá e o livro originou-se <a href="http://www.boaglio.com/go.php?http://www.caelum.com.br/curso/fj91" title="curso (9 hits)" target="_blank">do curso deles</a>. Percebam que é perfeitamente comum você ler um texto de Java da Oracle e eles mencionarem o JDeveloper, ou um texto da IBM que mencione o DB2. </p>
<p>No geral é uma leitura obrigatória para qualquer profissional Java, eu recomendo.</p>
<p><a href="http://www.boaglio.com/go.php?http://www.boaglio.com/wp-content/uploads/2012/04/thumbs-up.png" title="(107 hits)"><img src="http://www.boaglio.com/wp-content/uploads/2012/04/thumbs-up.png" alt="" title="thumbs-up" width="180" height="199" class="aligncenter size-full wp-image-727" /></a></p>
<p>Espero que os autores encontrem mais tempo para novas literaturas, pois a comunidade brasileira precisa de bom conteúdo tecnológico.</p>
<p>Fernando Boaglio, para a comunidade. </p>
<p><map name='google_ad_map_719_74531d4cc4df7f28'>
<area shape='rect' href='http://imageads.googleadservices.com/pagead/imgclick/719?pos=0' coords='1,2,367,28' />
<area shape='rect' href='http://services.google.com/feedback/abg' coords='384,10,453,23'/></map>
<img usemap='#google_ad_map_719_74531d4cc4df7f28' border='0' src='http://imageads.googleadservices.com/pagead/ads?format=468x30_aff_img&amp;client=&amp;channel=&amp;output=png&amp;cuid=719&amp;url= http%3A%2F%2Fwww.boaglio.com%2Findex.php%2F2012%2F05%2F01%2Fnova-referencia-de-java-em-portugues%2F' /></p><div class="al2fb_like_button"><div id="fb-root"></div><script type="text/javascript">
(function(d, s, id) {
  var js, fjs = d.getElementsByTagName(s)[0];
  if (d.getElementById(id)) return;
  js = d.createElement(s); js.id = id;
  js.src = "//connect.facebook.net/pt_BR/all.js#xfbml=1&appId=357307720952117";
  fjs.parentNode.insertBefore(js, fjs);
}(document, "script", "facebook-jssdk"));
</script>
<fb:like href="http://www.boaglio.com/index.php/2012/05/01/nova-referencia-de-java-em-portugues/" layout="standard" show_faces="true" width="450" action="like" font="arial" colorscheme="light" ref="AL2FB"></fb:like></div>]]></content:encoded>
			<wfw:commentRss>http://www.boaglio.com/index.php/2012/05/01/nova-referencia-de-java-em-portugues/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.boaglio.com/index.php/2012/05/01/nova-referencia-de-java-em-portugues/</feedburner:origLink></item>
		<item>
		<title>A corrida Oracle:procedure,Java stored proc,JDBC Thin e OCI,quem ganha?</title>
		<link>http://feedproxy.google.com/~r/boaglio/~3/AkQ9gT1CfGc/</link>
		<comments>http://www.boaglio.com/index.php/2011/11/14/a-corrida-oracleprocedurejava-stored-procjdbc-thin-e-ociquem-ganha/#comments</comments>
		<pubDate>Tue, 15 Nov 2011 00:47:13 +0000</pubDate>
		<dc:creator>Fernando Boaglio</dc:creator>
				<category><![CDATA[banco de dados]]></category>
		<category><![CDATA[Java]]></category>

		<guid isPermaLink="false">http://www.boaglio.com/?p=700</guid>
		<description><![CDATA[Nesse artigo vou fazer um comparativo das opções de implementação com Oracle e Java, usando uma rotina que vai ler umas tabelas para buscar o CEP e depois fazer a carga em outra. As opções que temos: - Antes de existir Java: a velha e boa stored procedure em PL/SQL &#8230; é um código pré-compilado [...]]]></description>
			<content:encoded><![CDATA[<p>Nesse artigo vou fazer um comparativo das opções de implementação com Oracle e Java, usando uma rotina que vai ler umas tabelas para buscar o <a href="http://www.boaglio.com/go.php?http://www.coisasuteis.com.br/2009/06/banco-de-cep-em-formatos-mysql-e-access/" title="(96 hits)">CEP</a> e depois fazer a carga em outra.</p>
<p><img src="http://www.boaglio.com/wp-content/uploads/2011/11/GreyhoundRace.jpg" alt="" title="corrida" width="609" height="340" class="aligncenter size-full wp-image-705" /><br />
<script type="text/javascript">google_ad_client = "pub-3816383189082763";google_ad_slot = "0931072200";google_ad_width = 468;google_ad_height = 60;</script>
<script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script> </p>
<p>As opções que temos:</p>
<p>- Antes de existir Java: a velha e boa stored procedure em PL/SQL &#8230; é um código pré-compilado em p-code que fica armazenado dentro do banco de dados&#8230; acesso local e nativo aos dados.</p>
<p>- Java client com <a href="http://www.boaglio.com/go.php?http://www.oracle.com/technetwork/database/enterprise-edition/jdbc-112010-090769.html" title="(99 hits)">driver JDBC Thin</a> &#8211; acesso remoto aos dados.</p>
<p>- Java client com <a href="http://www.boaglio.com/go.php?http://www.oracle.com/technetwork/database/enterprise-edition/jdbc-112010-090769.html" title="(99 hits)">driver OCI Thin</a> &#8211; acesso remoto e nativo aos dados.</p>
<p>- Java em stored procedure &#8211; desde o Oracle 8i temos uma engine em Java dentro do banco, o que nos possibilita executar rotinas em Java dentro do banco, com acesso local e nativo aos dados.</p>
<p>É impressionante a quantidade de profissionais Java que trabalha há anos com Oracle não conhece metade das opções existentes. </p>
<p>A implementação mais usada é a <strong>JDBC Thin</strong>, pois é a mais fácil de configurar, mas de acordo com a Oracle é a mais lenta de todas.</p>
<p>O <strong>Oracle OCI</strong> (<a href="http://www.boaglio.com/go.php?http://www.orafaq.com/wiki/Oracle_Call_Interfaces" title="(57 hits)">Oracle Call Interface</a>) é a maneira nativa que os clients utilizam para se conectar ao banco de dados, essa maneira nativa pode ser feita em várias linguagens (C, Cobol , <a href="http://www.boaglio.com/go.php?http://www.orafaq.com/wiki/JDBC#OCI_driver" title="(54 hits)">Java</a>) utilizando as bibliotecas do Oracle Client para acessar o banco de dados. Isso significa que para usar OCI, a instalação do Oracle client é obrigatória.</p>
<p>Ferramentas como Oracle SQL*Plus, <a href="http://www.boaglio.com/go.php?http://www.allroundautomations.com/plsqldev.html" target="_blank" title="(57 hits)">PL/SQL Developer</a> são rápidas porque usam OCI para acessar o banco de dados.</p>
<p>A configuração adequada do OCI pode ser complicada a primeira vez, e somente nesse fórum russo eu encontrei <a href="http://www.boaglio.com/go.php?http://www.sql.ru/forum/actualthread.aspx?tid=849644" title="(405 hits)">um simples resumo que explica como configurar o seu ambiente para usar OCI</a> (depois de instalado o Oracle Client):</p>
<p>Em plataforma Windows:</p>
<p><em><br />
- Adicione  [ORACLE_HOME] \ jdbc \ lib \ ojdbc5.jar ao CLASSPATH para JDK 1.5 ou<br />
            [ORACLE_HOME] \ jdbc \ lib \ ojdbc6.jar para JDK 1.6.<br />
- Adicione  [ORACLE_HOME] \ jlib \ orai18n.jar ao CLASSPATH.<br />
- Adicione  [ORACLE_HOME] \ bin ao PATH (que fica nas variáveis de ambiente, nas configurações avançadas do Sistema)<br />
</em></p>
<p>Em plataforma Unix:</p>
<p><em>- Adicione  [ORACLE_HOME] / jdbc / lib / ojdbc5.jar ao CLASSPATH para JDK 1.5 ou<br />
            [ORACLE_HOME] / jdbc / lib / ojdbc6.jar para JDK 1.6.<br />
- Adicione  [ORACLE_HOME] / jlib / orai18n.jar ao CLASSPATH.<br />
- Adicione  [ORACLE_HOME] / jdbc / lib ao LD_LIBRARY_PATH<br />
</em></p>
<p>Para trabalhar com <strong>Oracle Stored Procedures</strong>, você precisa primeiro ter uma ferramenta como <a href="http://www.boaglio.com/go.php?http://www.eclipse.org" target="_blank" title="(1342 hits)">Eclipse</a> para desenvolver suas rotinas, e depois gerar suas classes com compatibilidade para JDK 1.5 (se for Oracle 11i) e JDK 1.4 (se for Oracle 10g). </p>
<p>Além disso, a opção de Java deve estar ativa no banco de dados, verifique com o SQL:</p>
<pre class="brush: sql; title: ; notranslate">
SQL&gt; select value from V$option where parameter='Java';

VALUE
-------------------------------------------------------
TRUE
</pre>
<p>Essa opção Java não está disponível no Oracle Express Edition, é preciso instalar uma versão Personal Oracle, Standard ou Enterprise Edition. </p>
<p>Para <a href="http://www.boaglio.com/go.php?http://download.oracle.com/docs/cd/B12037_01/java.101/b12021/storproc.htm" target="_blank" title="(98 hits)">carregar as classes em Java no banco</a> é utilizado o loadjava, como por exemplo para carregar a nossa classe para o teste da corrida:</p>
<pre class="brush: sql; title: ; notranslate">
C:\workspace\corridaOracle\bin\&gt;loadjava -user=boaglio1/boaglio1@boaglio1 -verbose TesteDeInternalProcedure.class

arguments: '-user' 'boaglio1/***@boaglio1' '-verbose' 'TesteDeInternalProcedure.
class'
creating : class com/boaglio/corridaOracle/TesteDeInternalProcedure
loading  : class com/boaglio/corridaOracle/TesteDeInternalProcedure
Classes Loaded: 1
Resources Loaded: 0
Sources Loaded: 0
Published Interfaces: 0
Classes generated: 0
Classes skipped: 0
Synonyms Created: 0
Errors: 0
</pre>
<p>E depois amarramos essa classe com uma procedure, dessa maneira:</p>
<pre class="brush: sql; title: ; notranslate">
create or replace procedure teste_java
 as
 language java
 name 'com/boaglio/corridaOracle/TesteDeInternalProcedure.main(java.lang.String[])';
</pre>
<p>Bom, vamos falar agora do processo de carga&#8230; temos o primeiro exemplo que é executado inteiramente em PL/SQL:</p>
<pre class="brush: sql; title: ; notranslate">
 create or replace procedure teste_proc
is
 cursor todos_ceps is select * from cep;
 id_corrida integer;
begin

select corrida.nextval into id_corrida from dual;

for linha in todos_ceps loop
 if loweR(linha.cidade) like '%paulo%' then
  INSERT INTO TESTE_PROCEDURE (ID,UF,CIDADE,BAIRRO,ENDERECO_CEP,LOGRADOURO,ID_CORRIDA)
  VALUES (seq1.nextval,linha.uf,linha.cidade,linha.bairro,linha.endereco_cep,linha.logradouro,id_corrida);
 end if;
end loop;

end teste_proc;
</pre>
<p>Depois temos o outro exemplo que será chamado por todas as outras classes Java: </p>
<pre class="brush: java; title: ; notranslate">
package com.boaglio.corridaOracle;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class CargaDeDadosDoCEP {

	static final String todos_ceps = &quot;select * from cep&quot;;

	static final int DRIVER_JDBC_THIN=1;
	static final int DRIVER_JDBC_OCI=2;
	public  static final int INTERNAL_JAVA_PROC=3;

	public static void runLoad(Connection conexao,int tipoDeDriver) {

		Statement stmt = null;
		ResultSet rset = null;
		try {
			int idCorrida = buscaIdCorrida(conexao);
			stmt = conexao.createStatement();
			rset = stmt.executeQuery(todos_ceps);
			while (rset.next())
				validaDados(rset,conexao,tipoDeDriver,idCorrida);
		} catch (Exception ignore) {
		} finally {
			try {
				rset.close();
				stmt.close();
				if (tipoDeDriver!=CargaDeDadosDoCEP.INTERNAL_JAVA_PROC)
				   conexao.close();
			} catch (Exception ignore) {
			}
		}
	}

	private static int buscaIdCorrida(Connection conexao) {

		Statement stmt = null;
		ResultSet rset = null;
		int idCorrida =0;
		try {
			stmt = conexao.createStatement();
			rset = stmt.executeQuery(&quot;select corrida.nextval from dual&quot;);
			while (rset.next())
				idCorrida = rset.getInt(1);
		} catch (Exception ignore) {
		} finally {
			try {
				rset.close();
				stmt.close();
			} catch (Exception ignore) {
			}
		}
		return idCorrida;
	}

	private static void validaDados(ResultSet rset,Connection conexao,int tipoDeDriver,int idCorrida) throws SQLException {

		String cidade = rset.getString(&quot;cidade&quot;);
		String busca = &quot;paulo&quot;;

		String SQL_CARGA=&quot;&quot;;
		if (tipoDeDriver==DRIVER_JDBC_THIN) {
			SQL_CARGA=&quot;INSERT INTO TESTE_DRIVER_THIN             (ID,UF,CIDADE,BAIRRO,ENDERECO_CEP,LOGRADOURO,ID_CORRIDA) &quot;+
            &quot;VALUES (seq2.nextval,?,?,?,?,?,?)&quot;;
		} else if (tipoDeDriver==DRIVER_JDBC_OCI) {
			SQL_CARGA=&quot;INSERT INTO TESTE_DRIVER_OCI (ID,UF,CIDADE,BAIRRO,ENDERECO_CEP,LOGRADOURO,ID_CORRIDA) &quot;+
			&quot;VALUES (seq3.nextval,?,?,?,?,?,?)&quot;;
		} else	if (tipoDeDriver==INTERNAL_JAVA_PROC) {
			SQL_CARGA=&quot;INSERT INTO TESTE_JAVA_PROC (ID,UF,CIDADE,BAIRRO,ENDERECO_CEP,LOGRADOURO,ID_CORRIDA) &quot;+
	        &quot;VALUES (seq4.nextval,?,?,?,?,?,?)&quot;;
		}
		if (cidade==null) return;
		if (cidade.toLowerCase().indexOf(busca)&gt;=0) {
			PreparedStatement pstmt = null;
			try {
			        pstmt = conexao.prepareStatement(SQL_CARGA);
				pstmt.setString(1,rset.getString(&quot;uf&quot;));
				pstmt.setString(2,cidade);
				pstmt.setString(3,rset.getString(&quot;bairro&quot;));
				pstmt.setString(4,rset.getString(&quot;endereco_cep&quot;));
				pstmt.setString(5,rset.getString(&quot;logradouro&quot;));
				   pstmt.setInt(6,idCorrida);
				pstmt.executeUpdate();

			} catch (Exception e) {
				e.printStackTrace();
			} finally {
				try {
				pstmt.close();
				} catch (Exception ignore) {
				}
			}
		}
	}
}
</pre>
<p>Em ambos os casos temos o mesmo processo: buscar em uma View de todos os endereços do Brasil os que contém &#8220;paulo&#8221; no nome da cidade e armazenar em uma tabela separada. </p>
<p>Temos 57789 de 699307 registros (8,25%) em cada execução da rotina.</p>
<p>O cálculo foi feito da diferença do primeiro e o último insert (o tempo de 57789 inserções na base).</p>
<p>O teste foi feito sem envolver rede, no próprio servidor para tirar essa dúvida da nossa corrida.  </p>
<p>Em todos os quatro casos as rotinas foram executadas dez vezes, com a seguinte performance:</p>
<p><a href="http://www.boaglio.com/go.php?http://www.boaglio.com/wp-content/uploads/2011/11/now-what-wecansolveit-gorejpg.jpeg" title="(587 hits)"><img src="http://www.boaglio.com/wp-content/uploads/2011/11/now-what-wecansolveit-gorejpg.jpeg" alt="" title="now-what-wecansolveit-gorejpg" width="289" height="229" class="aligncenter size-full wp-image-711" /></a></p>
<ol>
<li>Em primeiro lugar não é nenhuma surpresa que foi o PL/SQL, com tempo mínimo de 10 segundos, máximo de 12 e médio de 11.3</li>
<li>Em segundo lugar, pertinho vieram as stored procedures em Java, com tempo mínimo de 23 segundos, máximo de 25 e médio de 23,9</li>
<li>Em terceiro lugar, bem atrás vieram os drivers JDBC Thin, com tempo mínimo de 59 segundos, máximo de 79 e médio de 67</li>
<li>Em último lugar vieram os drivers JDBC OCI, com tempo mínimo de 64 segundos, máximo de 95 e médio de 71,9</li>
</ol>
<p>Vamos fazer algumas comparações com os tempos médios&#8230; <strong>a mesma rotina em PL/SQL roda 2 vezes mais rápido que uma stored procedure Java e 6 vezes mais rápido uma rotina de OCI, isso mesmo 6 vezes</strong>!</p>
<p>O interessante é que a Oracle recomenda usar o driver Thin para maior portabilidade e o driver OCI para melhor performance, mas nessa minha corrida e <a href="http://www.boaglio.com/go.php?http://oreilly.com/catalog/jorajdbc/chapter/ch19.html" target="_blank" title="(68 hits)">em outras literaturas dizem exatamente o oposto</a>.</p>
<p>Quer testar você mesmo? Acesse o <a href="http://www.boaglio.com/go.php?https://github.com/boaglio/corridaOracle/downloads" target="_blank" title="(80 hits)">fonte do projeto</a> e tire suas próprias conclusões!</p>
<p><map name='google_ad_map_700_74531d4cc4df7f28'>
<area shape='rect' href='http://imageads.googleadservices.com/pagead/imgclick/700?pos=0' coords='1,2,367,28' />
<area shape='rect' href='http://services.google.com/feedback/abg' coords='384,10,453,23'/></map>
<img usemap='#google_ad_map_700_74531d4cc4df7f28' border='0' src='http://imageads.googleadservices.com/pagead/ads?format=468x30_aff_img&amp;client=&amp;channel=&amp;output=png&amp;cuid=700&amp;url= http%3A%2F%2Fwww.boaglio.com%2Findex.php%2F2011%2F11%2F14%2Fa-corrida-oracleprocedurejava-stored-procjdbc-thin-e-ociquem-ganha%2F' /></p><div class="al2fb_like_button"><div id="fb-root"></div><script type="text/javascript">
(function(d, s, id) {
  var js, fjs = d.getElementsByTagName(s)[0];
  if (d.getElementById(id)) return;
  js = d.createElement(s); js.id = id;
  js.src = "//connect.facebook.net/pt_BR/all.js#xfbml=1&appId=357307720952117";
  fjs.parentNode.insertBefore(js, fjs);
}(document, "script", "facebook-jssdk"));
</script>
<fb:like href="http://www.boaglio.com/index.php/2011/11/14/a-corrida-oracleprocedurejava-stored-procjdbc-thin-e-ociquem-ganha/" layout="standard" show_faces="true" width="450" action="like" font="arial" colorscheme="light" ref="AL2FB"></fb:like></div>]]></content:encoded>
			<wfw:commentRss>http://www.boaglio.com/index.php/2011/11/14/a-corrida-oracleprocedurejava-stored-procjdbc-thin-e-ociquem-ganha/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.boaglio.com/index.php/2011/11/14/a-corrida-oracleprocedurejava-stored-procjdbc-thin-e-ociquem-ganha/</feedburner:origLink></item>
		<item>
		<title>Quando está na hora de mudar de emprego ?</title>
		<link>http://feedproxy.google.com/~r/boaglio/~3/qz5yeCyH4eM/</link>
		<comments>http://www.boaglio.com/index.php/2011/09/20/quando-esta-na-hora-de-mudar-de-emprego/#comments</comments>
		<pubDate>Tue, 20 Sep 2011 03:53:15 +0000</pubDate>
		<dc:creator>Fernando Boaglio</dc:creator>
				<category><![CDATA[Clube dos 10]]></category>
		<category><![CDATA[Engenharia de Software]]></category>

		<guid isPermaLink="false">http://www.boaglio.com/?p=648</guid>
		<description><![CDATA[Se alguém que está no mercado nunca foi demitido, ele só pode estar em duas situações: ou é novo no mercado ou é um cara de sorte! Nas diversas empresas que passei eu percebi que nem sempre a demissão está ligada à falta de competência do empregado. Além do mais, nem os competentes conseguem uma [...]]]></description>
			<content:encoded><![CDATA[<p>Se alguém que está no mercado nunca foi demitido, ele só pode estar em duas situações: ou é novo no mercado ou é um cara de sorte! </p>
<p>Nas diversas empresas que passei eu percebi que <strong>nem sempre</strong> a demissão está ligada à falta de competência do empregado. Além do mais, nem os competentes conseguem <a href="http://www.boaglio.com/go.php?http://www.boaglio.com/index.php/2009/12/12/10-coisas-que-todo-gerente-deveria-fazer-ao-demitir-alguem/" title="(84 hits)">uma demissão digna</a>.</p>
<p><a href="http://www.boaglio.com/go.php?http://www.boaglio.com/wp-content/uploads/2011/09/workplace-depression.jpeg" title="(751 hits)"><img src="http://www.boaglio.com/wp-content/uploads/2011/09/workplace-depression.jpeg" alt="" title="workplace depression" width="400" height="300" class="aligncenter size-full wp-image-692" /></a><br />
<script type="text/javascript">google_ad_client = "pub-3816383189082763";google_ad_slot = "0931072200";google_ad_width = 468;google_ad_height = 60;</script>
<script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script></p>
<p>Mas as vezes não precisa chegar a esse ponto, existem alguns sinais que mostram que <em>está na hora de mudar</em>. Vou enumerar algum deles, e se você se identificou com pelo menos cinco , então já sabe o que fazer. Não será fácil, mas será o melhor tanto para você quanto para a sua empresa.</p>
<ul>
<li><strong>o tempo muda</strong> &#8211; começa o expediente e você está pensando na hora hora de ir embora&#8230; não uma sexta-feira ou uma véspera de feriado, mas simplesmente todo dia! Você faz uma pausa, tenta tomar um café ou ir ao toalete, mas a hora não passa!</li>
<li><strong>desânimo</strong>- é exatamente o sentimento oposto ao primeiro dia de trabalho, começa uma sensação que esse dia está muito longe, parece que foi há muitos anos quando na verdade pode ser coisa de meses.</li>
<li><strong>irritação</strong> &#8211; qualquer coisa que antes você nem notava agora se irrita facilmente, normalmente os familiares acabam reclamando disso também, que o seu comportamento mudou. </li>
<li><strong>perda rápida de concentração</strong> &#8211; com as pendências para fazer, mesmo com silêncio ou com fone de ouvido a perda de concentração é muito rápida, a vontade de acessar a Internet ou ver o email pessoal aumenta exageradamente. </li>
<li><strong>motivação zero</strong> &#8211; não deve vir da empresa a motivação, mas de você, de encarar os desafios que o emprego oferece. Se deixou de ser um desafio há tempos, se não consegue encontrar um bom motivo para o trabalho, se ao levantar da cama, a sua alegria dura alguns segundos até lembrar que tem que trabalhar, então sua motivação acabou. </li>
<p><a href="http://www.boaglio.com/go.php?http://www.boaglio.com/wp-content/uploads/2011/09/pain.jpg" title="(644 hits)"><img src="http://www.boaglio.com/wp-content/uploads/2011/09/pain.jpg" alt="" title="pain" width="456" height="414" class="aligncenter size-full wp-image-693" /></a></p>
<li><strong>regras da empresa mudaram</strong> para pior (no seu ponto de vista), o que é bem comum e acontece quase sempre, ainda mais que quanto maior a empresa, a política e a burocracia aumentam exponencialmente. </li>
<li><strong>seus planos mudaram</strong> &#8211; o motivo principal que te fez mudar de emprego já não é tão importante. Lembre-se que o emprego é um tripé formado pela sua carreira, ambiente de trabalho e salário. Se duas dessas três coisas mudaram, a casa caiu!</li>
<li><strong>palpites de antigos empregados</strong> &#8211; mais de uma pessoa já saiu da empresa e diz para você fazer o mesmo. Isso é mais difícil de acontecer, mas as vezes sem coragem de encarar o mercado afora, você não se dá conta de que algumas coisas como trabalhar de graça ou fazer hora extra todo dia não deve ser regra e sim exceção. </li>
<li><strong>conselhos do seu networking</strong>  &#8211; depois de comentar algo sobre o seu trabalho, algum amigo que não te vê há um tempo aconselha que você mude de emprego. Depois de tanto tempo aceitando coisa errada, a gente acaba até achando que é certa, normal, até que alguém de fora fale para gente o óbvio. </li>
<li><strong>falta de um empregado modelo</strong> &#8211; é interessante ter dentro da empresa um funcionário que é um modelo para os outros, que é o que esperamos ser dentro de alguns anos. </li>
</ul>
<p>As pessoas precisam entender o seguinte: <em>uma empresa não é um clube de amigos ou uma entidade sem fins lucrativos</em>, ela é uma máquina que para funcionar e gerar retorno financeiro precisa de peças, umas mais baratas e outras mais caras. Você é uma peça, é um investimento, que no ponto de vista dos donos da empresa, pode ser trocada a qualquer momento. </p>
<p>Se sua motivação acabou e não tem o que fazer, continuar na mesma empresa não será um bom negócio nem para sua carreira e nem para quem paga seu salário.</p>
<p><em>Fernando Boaglio, para a comunidade.</em></p>
<p><map name='google_ad_map_648_74531d4cc4df7f28'>
<area shape='rect' href='http://imageads.googleadservices.com/pagead/imgclick/648?pos=0' coords='1,2,367,28' />
<area shape='rect' href='http://services.google.com/feedback/abg' coords='384,10,453,23'/></map>
<img usemap='#google_ad_map_648_74531d4cc4df7f28' border='0' src='http://imageads.googleadservices.com/pagead/ads?format=468x30_aff_img&amp;client=&amp;channel=&amp;output=png&amp;cuid=648&amp;url= http%3A%2F%2Fwww.boaglio.com%2Findex.php%2F2011%2F09%2F20%2Fquando-esta-na-hora-de-mudar-de-emprego%2F' /></p><div class="al2fb_like_button"><div id="fb-root"></div><script type="text/javascript">
(function(d, s, id) {
  var js, fjs = d.getElementsByTagName(s)[0];
  if (d.getElementById(id)) return;
  js = d.createElement(s); js.id = id;
  js.src = "//connect.facebook.net/pt_BR/all.js#xfbml=1&appId=357307720952117";
  fjs.parentNode.insertBefore(js, fjs);
}(document, "script", "facebook-jssdk"));
</script>
<fb:like href="http://www.boaglio.com/index.php/2011/09/20/quando-esta-na-hora-de-mudar-de-emprego/" layout="standard" show_faces="true" width="450" action="like" font="arial" colorscheme="light" ref="AL2FB"></fb:like></div>]]></content:encoded>
			<wfw:commentRss>http://www.boaglio.com/index.php/2011/09/20/quando-esta-na-hora-de-mudar-de-emprego/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://www.boaglio.com/index.php/2011/09/20/quando-esta-na-hora-de-mudar-de-emprego/</feedburner:origLink></item>
		<item>
		<title>O que realmente acontece quando você acessa uma URL</title>
		<link>http://feedproxy.google.com/~r/boaglio/~3/iBiDlWA-oPw/</link>
		<comments>http://www.boaglio.com/index.php/2011/05/02/o-que-realmente-acontece-quando-voce-acessa-uma-url/#comments</comments>
		<pubDate>Mon, 02 May 2011 04:00:11 +0000</pubDate>
		<dc:creator>Fernando Boaglio</dc:creator>
				<category><![CDATA[Firefox]]></category>
		<category><![CDATA[www]]></category>

		<guid isPermaLink="false">http://www.boaglio.com/?p=350</guid>
		<description><![CDATA[Acontece bastante coisa quando você acessa um site e de tanto fazer isso a gente se esquece de como funciona e deixa de valorizar a enorme infraestrutura que mantém tudo isso funcionando. Eu li um artigo esses dias e resolvi adaptar para uma versão brasileira, boa leitura! Como um desenvolvedor de software, certamente você tem [...]]]></description>
			<content:encoded><![CDATA[<p>Acontece bastante coisa quando você acessa um site e de tanto fazer isso a gente se esquece de como funciona e deixa de valorizar a enorme infraestrutura que mantém tudo isso funcionando. Eu li um <a href="http://www.boaglio.com/go.php?http://igoro.com/archive/what-really-happens-when-you-navigate-to-a-url/" title="(111 hits)">artigo</a> esses dias e resolvi adaptar para uma versão brasileira, boa leitura!</p>
<p>Como um desenvolvedor de software, certamente você tem uma ideia bem por cima de como funcionam as aplicações web e quais os tipos de tecnologias estão envolvidos: o navegador, HTTP, HTML, o servidor web, gerenciamento de requests e  assim por diante.</p>
<p>Neste artigo, vamos dar uma olhada mais a fundo na seqüência de eventos que acontecem quando você visita um URL.</p>
<p><strong>1.  Você digita o endereço do site (URL) no navegador web:</strong></p>
<p>Tudo começa aqui:</p>
<p><a href="http://www.boaglio.com/go.php?http://www.boaglio.com/wp-content/uploads/2011/04/https1.png" title="(2020 hits)"><img src="http://www.boaglio.com/wp-content/uploads/2011/04/https1.png" alt="" title="https1" width="800"   class="aligncenter size-full wp-image-651" /></a><br />
<!--adsense#bannertextomeio--></p>
<p><strong><br />
2. O navegador procura o endereço IP para o nome do domínio<br />
</strong></p>
<p> <a href="http://www.boaglio.com/go.php?http://www.boaglio.com/wp-content/uploads/2011/04/https2.png" title="(1500 hits)"><img src="http://www.boaglio.com/wp-content/uploads/2011/04/https2.png" alt="" title="https2" width="228" height="96" class="aligncenter size-full wp-image-653" /></a></p>
<p>O primeiro passo para a navegação é descobrir o endereço IP do domínio visitado. </p>
<p>O lookup do <a href="http://www.boaglio.com/go.php?http://en.wikipedia.org/wiki/Domain_Name_System" title="(82 hits)">DNS</a> acontece da seguinte forma:</p>
<ul>
<li> <strong> Cache do navegador </strong> – o navegador faz cache dos registros do DNS por algum tempo. Curiosamente o sistema operacional não fala ao navegador o tempo de vida de cada registro do DNS, e portanto o navegador guarda por um tempo fixo que varia entre 2 e 30 minutos dependendo do navegador.</li>
<li>  <strong>Cache do sistema operacional</strong> &#8211; se o cache do browser não contém o registro desejado, o navegador faz uma chamada de sistema (gethostbyname no Windows e Linux). O sistema operacional tem seu próprio cache.</li>
<li>  <strong>  Cache do roteador</strong> &#8211; a requisição continua no seu roteador, que normalmente tem seu cache de DNS próprio.</li>
<li>    <strong>  <a href="http://www.boaglio.com/go.php?http://en.wikipedia.org/wiki/ISP" title="(82 hits)">ISP</a> DNS cache</strong> – The next place checked is the cache ISP&#8217;s DNS server. </li>
<li>    <strong>  Cache DNS do seu provedor </strong> &#8211; O próximo lugar é o servidor verificar o cache de DNS do seu provedor (Internet Service Provider), que naturalmente também possui um cache.
</li>
<p>   <strong>  <strong>Busca recursiva</strong> &#8211; Seu servidor de DNS do seu provedor começa uma busca recursiva, a partir do servidor de nomes raiz, através do nível maior .com e descendo para o servidor de nomes do Facebook.  Normalmente, o servidor DNS tem os nomes dos servidores .com em cache, e assim que um acesso ao servidor de nomes raiz não será necessário.</strong>
</ul>
<p>Aqui está um diagrama do que uma pesquisa DNS recursivo parece:</p>
<p><a href="http://www.boaglio.com/go.php?http://www.boaglio.com/wp-content/uploads/2011/04/https3.png" title="(1817 hits)"><img src="http://www.boaglio.com/wp-content/uploads/2011/04/https3-1024x360.png" alt="" title="https3" width="1024" height="360" class="aligncenter size-large wp-image-656" /></a></p>
<p>Uma coisa preocupante sobre o DNS é que todo o domínio wikipedia.org ou facebook.com mapeia para um único endereço IP, mas felizmente, existem maneiras de diminuir esse gargalo:</p>
<ul>
<li>      <a href="http://www.boaglio.com/go.php?http://en.wikipedia.org/wiki/Round_robin_DNS" title="(92 hits)">Round-robin DNS</a> é uma solução onde o DNS retorna vários endereços IP, em vez de apenas um.  Por exemplo, o facebook.com realmente mapeia para quatro endereços IP.</li>
<li>      <a href="http://www.boaglio.com/go.php?http://en.wikipedia.org/wiki/Load_balancing_(computing)" title="(88 hits)">Load-balancer</a> (balanceamento de carga) é um hardware que escuta um específico endereço IP e encaminha a requisição para outros servidores. A maioria dos grandes sites usa um balanceamento de carga de alta performance que costuma custar caro.</li>
<li>      Geographic DNS melhora a escalabilidade, mapeando um nome de domínio para diferentes endereços IP , dependendo da localização geográfica do cliente.<br />
Isso é ótimo para a hospedagem de conteúdo estático para que servidores diferentes não tenham que atualizar o estado compartilhado toda hora.
</li>
<li>     <a href="http://www.boaglio.com/go.php?http://en.wikipedia.org/wiki/Anycast#Domain_Name_System" title="(107 hits)">Anycast</a> é uma técnica de roteamento em que um único endereço IP mapeia múltiplos servidores físicos. Infelizmente o anycast não se encaixa bem com TCP e raramente é usado nesse cenário. </li>
<p>A maioria dos servidores de DNS próprios usam anycast para alcançar alta disponibilidade e baixa latência do DNS.</p>
</ul>
<p><strong>3. O navegador envia uma requisição HTTP para o servidor web</strong></p>
<p><a href="http://www.boaglio.com/go.php?http://www.boaglio.com/wp-content/uploads/2011/05/https4.png" title="(1192 hits)"><img src="http://www.boaglio.com/wp-content/uploads/2011/05/https4.png" alt="" title="https4" width="216" height="95" class="aligncenter size-full wp-image-659" /></a></p>
<p>Você pode ter certeza que a página do Facebook não virá do cache do browser, porque as páginas dinâmicas expiraram muito rápido ou imediatamente (a data de validade vem fixa para o passado).</p>
<p>Assim, o browser vai enviar esta requisição para o servidor Facebook:</p>
<blockquote><p>
GET / HTTP/1.1</p>
<p>Host: facebook.com</p>
<p>User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:2.0) Gecko/20110407 Firefox/4.0</p>
<p>Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8</p>
<p>Accept-Language: pt-br,en-us;q=0.7,en;q=0.3</p>
<p>Accept-Encoding: gzip, deflate</p>
<p>Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7</p>
<p>Keep-Alive: 115</p>
<p>Connection: keep-alive</p>
<p>Cookie: datr=1261098066-a8f926188683ac0ea09fcd9f28bba06e82e2304fa1d5ced3f9ffa; lsd=5J8NE; reg_fb_gate=http%3A%2F%2Fwww.facebook.com%2F; reg_fb_ref=http%3A%2F%2Fwww.facebook.com%2F; wd=1050&#215;756
</p></blockquote>
<p>A requisição GET chama a URL para buscar: &#8220;http://facebook.com/&#8221;. O navegador se identifica (<em>User-Agent </em>no cabeçalho), e afirma que tipos de respostas vai aceitar (Accept e Accept-Encoding no cabeçalho). O Connection do cabeçalho pede ao servidor para manter a conexão TCP aberta para outros pedidos.</p>
<p>O pedido inclui também os cookies que o navegador tem para este domínio. Como você provavelmente já sabe, os cookies são valores chave do tipo chave=valor , que completam o estado de um site, entre diferentes requisições de páginas.  E assim, os cookies armazenam o nome do usuário logado, um número secreto que foi atribuído ao usuário pelo servidor, algumas das configurações do usuário, etc. Os cookies serão guardados em um arquivo de texto no caso do Internet Explorer e em um banco de dados no caso do Firefox, e enviados para o servidor a cada requisição.</p>
<p>Existe uma grande variedade de ferramentas que permitem visualizar as requisições HTTP e suas respostas correspondentes.<br />
Minha ferramenta favorita para a visualização do tráfego HTTP no IE é o <a href="http://www.boaglio.com/go.php?http://www.fiddler2.com/fiddler2/" title="(91 hits)">fiddler</a>, e no Firefox temos o <a href="http://www.boaglio.com/go.php?http://www.getfirebug.com" title="(291 hits)">Firebug</a> e também o <a href="http://www.boaglio.com/go.php?http://livehttpheaders.mozdev.org/" title="(85 hits)">Live HTTP Headers</a> .</p>
<p>Além das requisições GET, outro tipo de requisições que você pode estar familiarizado com uma requisição POST, tipicamente usado para enviar formulários. </p>
<p>A requisição GET envia os seus parâmetros através do URL (ex.: http://robozzle.com/puzzle.aspx? Id = 85) e a requisição POST envia os parâmetros no corpo da requisição, logo abaixo do cabeçalho.</p>
<p>A barra final da URL &#8220;http://facebook.com/&#8221; é importante. Neste caso, o navegador pode seguramente adicionar a barra. Para URLs com um formulário http://exemplo.com/pastaOuArquivo  o navegador não pode adicionar automaticamente uma barra, porque não está claro se pastaOuArquivo é uma pasta ou um arquivo. Nesses casos, o navegador vai visitar a URL sem a barra, e o servidor responderá com um redirecionamento, resultando em uma ida desnecessária.</p>
<p><strong>4. O servidor responde com um redirecionamento permanente ao Facebook</strong></p>
<p><a href="http://www.boaglio.com/go.php?http://www.boaglio.com/wp-content/uploads/2011/05/https5.png" title="(1029 hits)"><img src="http://www.boaglio.com/wp-content/uploads/2011/05/https5.png" alt="" title="https5" width="214" height="87" class="aligncenter size-full wp-image-663" /></a></p>
<p>Esta é a resposta que o servidor Facebook enviou de volta para a requisição do navegador:</p>
<blockquote><p>
HTTP/1.1 301 Moved Permanently</p>
<p>Location: http://www.facebook.com/</p>
<p>Content-Type: text/html; charset=utf-8</p>
<p>X-FB-Server: 10.27.51.117</p>
<p>X-Cnection: close</p>
<p>Date: Sun, 01 May 2011 04:05:36 GMT</p>
<p>Content-Length: 0
</p></blockquote>
<p>O servidor respondeu com uma resposta de  &#8220;<em>301 Movido Permanentemente</em>&#8221; para dizer ao navegador para ir para &#8220;http://www.facebook.com/&#8221; em vez de &#8220;http://facebook.com/&#8221;.</p>
<p>Há razões interessante porque o servidor insiste no redirecionamento em vez de responder imediatamente com a página web que o usuário quer ver.<br />
Uma das razões tem a ver com o motor de pesquisa de posições (rankings). </p>
<p>Veja, se existirem duas URLs para a mesma página, digamos http://www.igoro.com/ e http://igoro.com/, motor de busca pode considerar dois sites diferentes, cada uma com menos links recebidos e assim, uma classificação mais baixa.<br />
Os motores de busca compreendem o redirecionamento permanente (301), e combinam os links recebidos de ambas as fontes em um ranking único.</p>
<p>Além disso, várias URLs para o mesmo conteúdo não ficam facilmente em cache (cache-friendly) .  Quando uma parte do conteúdo tem vários nomes, ela pode  aparecer várias vezes no mesmo cache.</p>
<p><strong>5. O browser segue o redirecionamento</strong></p>
<p><a href="http://www.boaglio.com/go.php?http://www.boaglio.com/wp-content/uploads/2011/05/https6.png" title="(979 hits)"><img src="http://www.boaglio.com/wp-content/uploads/2011/05/https6.png" alt="" title="https6" width="216" height="95" class="aligncenter size-full wp-image-665" /></a></p>
<p>O navegador agora sabe que &#8220;http://www.facebook.com/&#8221; é o URL correto para ir, e assim ele envia um pedido GET:</p>
<p>http://www.facebook.com/</p>
<blockquote><p>GET / HTTP/1.1</p>
<p>Host: www.facebook.com</p>
<p>User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:2.0) Gecko/20110407 Firefox/4.0</p>
<p>Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8</p>
<p>Accept-Language: pt-br,en-us;q=0.7,en;q=0.3</p>
<p>Accept-Encoding: gzip, deflate</p>
<p>Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7</p>
<p>Keep-Alive: 115</p>
<p>Connection: keep-alive</p>
<p>Cookie: datr=1261098066-a8f926188683ac0ea09fcd9f28bba06e82e2304fa1d5ced3f9ffa; lsd=5J8NE; reg_fb_gate=http%3A%2F%2Fwww.facebook.com%2F; reg_fb_ref=http%3A%2F%2Fwww.facebook.com%2F; wd=1050&#215;756</p>
</blockquote>
<p>O significado dos cabeçalhos é o mesmo que para a primeira requisição.</p>
<p><strong>6.O servidor trata a requisição</strong></p>
<p><a href="http://www.boaglio.com/go.php?http://www.boaglio.com/wp-content/uploads/2011/05/https7.png" title="(793 hits)"><img src="http://www.boaglio.com/wp-content/uploads/2011/05/https7.png" alt="" title="https7" width="93" height="78" class="aligncenter size-full wp-image-666" /></a></p>
<p>O servidor receberá o pedido GET, processará e enviará uma resposta.</p>
<p>Isto pode parecer uma tarefa simples, mas na verdade há um monte de coisas interessantes que acontecem aqui &#8211; mesmo em um site simples como o meu blog, não só em um site altamente escalável como o Facebook.</p>
<p>    * Software do servidor Web</p>
<p>    O software de servidor web (por exemplo, o IIS ou Apache) recebe a requisição HTTP e decide qual gerenciador de requisição (request handler) deve ser executado para processar este pedido.</p>
<p>  Um manipulador de requisição é um programa (em ASP.NET, PHP, Ruby, &#8230;) que lê a requisição e gera o código HTML para a resposta.</p>
<p>No caso mais simples, os gerenciadores de requisição podem ser armazenados em uma hierarquia de arquivo cuja estrutura reflete a estrutura de URL, e assim por exemplo http://example.com/pasta1/pagina1.aspx URL irá mapear para o arquivo /httpdocs/pasta1/pagina1.aspx ou C:\site\pasta1\pagina1.aspx . </p>
<p>O software de servidor web também pode ser configurado para que as URLs sejam mapeadas para os gerenciadores de requisição, e assim a URL público da pagina1.aspx poderia ser http://example.com/pasta1/pagina1.</p>
<p>    * Request handler </p>
<p>     O gerenciador lê a requisição, seus parâmetros e os seus cookies. Ele vai ler e, eventualmente, atualizar alguns dados armazenados no servidor. Em seguida, o gerenciador de requisição gerará uma resposta HTML. </p>
<p> Uma dificuldade interessante que cada site dinâmico enfrenta é a forma de armazenamento de dados. Os sites menores, muitas vezes, ter um único banco de dados SQL para armazenar seus dados, mas sites que armazenam uma grande quantidade de dados e / ou tem muitos visitantes têm de encontrar uma maneira de dividir o banco de dados através de múltiplas máquinas.As soluções incluem sharding (divisão de uma tabela em vários bancos de dados com base na chave primária), replicação e uso de bases de dados simplificada com consistência semântica enfraquecida.</p>
<p>Uma técnica para manter a atualização dos dados mais leve é adiar alguns dos trabalhos para um trabalho em lote. Por exemplo, o Facebook tem que atualizar o newsfeed em tempo hábil, mas os dados de apoio do recurso &#8220;pessoas que você pode conhecer&#8221;  pode apenas ser atualizado de noite . O trabalho em lote resulta em um pouco de lentidão geral nas atualizações com dados menos importantes, mas pode fazer atualizações de dados muito mais rápido e mais simples.</p>
<p><strong>7. O servidor envia de volta uma resposta HTML</strong></p>
<p><a href="http://www.boaglio.com/go.php?http://www.boaglio.com/wp-content/uploads/2011/05/https8.png" title="(849 hits)"><img src="http://www.boaglio.com/wp-content/uploads/2011/05/https8.png" alt="" title="https8" width="214" height="87" class="aligncenter size-full wp-image-667" /></a></p>
<p>Aqui está a resposta que o servidor gerado e enviado de volta:</p>
<blockquote><p>HTTP/1.1 200 OK</p>
<p>Cache-Control: private, no-cache, no-store, must-revalidate</p>
<p>Expires: Sat, 01 Jan 2000 00:00:00 GMT</p>
<p>P3P: CP=&#8221;Facebook does not have a P3P policy. Learn why here: http://fb.me/p3p&#8221;</p>
<p>Pragma: no-cache</p>
<p>Set-Cookie: reg_fb_ref=http%3A%2F%2Fwww.facebook.com%2F; path=/; domain=.facebook.com</p>
<p>Set-Cookie: wd=deleted; expires=Thu, 01-Jan-1970 00:00:01 GMT; path=/; domain=.facebook.com; httponly</p>
<p>Content-Encoding: gzip</p>
<p>Content-Type: text/html; charset=utf-8</p>
<p>X-FB-Server: 10.144.145.118</p>
<p>X-Cnection: close</p>
<p>Transfer-Encoding: chunked</p>
<p>Date: Sun, 01 May 2011 04:05:37 GMT
</p></blockquote>
<p>O cabeçalho<em> Content-Encoding</em> informa ao navegador que a resposta do corpo é comprimido utilizando o algoritmo gzip.<br />
Depois de descomprimir o blob, você verá o código HTML que você esperaria:</p>
<p><code><br />
&lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD XHTML 1.0 Strict//EN&quot;<br />
&quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd&quot;&gt;<br />
&lt;html xmlns=&quot;http://www.w3.org/1999/xhtml&quot; xml:lang=&quot;pt&quot; lang=&quot;pt&quot; id=&quot;facebook&quot; class=&quot; no_js&quot;&gt;<br />
&lt;head&gt;<br />
&lt;meta http-equiv=&quot;Content-type&quot; content=&quot;text/html; charset=utf-8&quot; /&gt;<br />
&lt;meta http-equiv=&quot;Content-language&quot; content=&quot;pt&quot; /&gt;<br />
&lt;script type=&quot;text/javascript&quot;&gt;<br />
//&lt;![CDATA[<br />
CavalryLogger=false;window._script_path = &quot;\/index.php&quot;;window._EagleEyeSeed=&quot;wP2A&quot;;__rm = {};<br />
//]]&gt;<br />
&lt;/script&gt;&lt;noscript&gt; &lt;meta http-equiv=refresh content=&quot;0; URL=/?_fb_noscript=1&quot; /&gt; &lt;/noscript&gt;</p>
<p>&lt;meta name=&quot;robots&quot; content=&quot;noodp,noydir&quot; /&gt;<br />
&lt;meta name=&quot;description&quot; content=&quot; O Facebook &eacute; uma rede social que re&uacute;ne pessoas a seus amigos e &agrave;queles com quem trabalham, estudam e convivem. As pessoas participam do Facebook para manter contato com seus amigos, carregar um n&uacute;mero ilimitado de fotos, compartilhar links e v&iacute;deos e aprender mais sobre as pessoas que conhecem.&lt;br /&gt;&lt;br /&gt;&quot; /&gt;<br />
&lt;link rel=&quot;alternate&quot; media=&quot;handheld&quot; href=&quot;http://www.facebook.com/&quot; /&gt;<br />
&lt;title&gt;Bem-vindo ao Facebook - acesse, cadastre-se ou saiba mais.&lt;/title&gt;&lt;noscript&gt;&lt;meta http-equiv=&quot;X-Frame-Options&quot; content=&quot;deny&quot; /&gt;&lt;/noscript&gt;<br />
 &lt;link type=&quot;text/css&quot; rel=&quot;stylesheet&quot; href=&quot;http://b.static.ak.fbcdn.net/rsrc.php/v1/yZ/r/dBoSKLwxlh0.css&quot; /&gt;</p>
<p> &lt;link type=&quot;text/css&quot; rel=&quot;stylesheet&quot; href=&quot;http://static.ak.fbcdn.net/rsrc.php/v1/y1/r/CkuMXVTz1uq.css&quot; /&gt;<br />
 &lt;link type=&quot;text/css&quot; rel=&quot;stylesheet&quot; href=&quot;http://b.static.ak.fbcdn.net/rsrc.php/v1/y8/r/--vMHqIJi-S.css&quot; /&gt;</p>
<p></code></p>
<p>Além de compressão, os cabeçalhos especificam se e como fazer o cache da página, e se existem cookies para definir (nenhum nesta resposta), informações particulares, etc.</p>
<p>Observe que o cabeçalho define o<em> Content-Type</em> como <em>text/html</em>.  O cabeçalho instrui o navegador para renderizar o conteúdo da resposta como HTML, em vez de dizer como fazer o download de um arquivo.  O navegador usará o cabeçalho para decidir como interpretar a resposta, mas no caso do IE pode considerar também a extensão da URL.</p>
<p><strong>8.  O navegador começa a renderização da página HTML</strong></p>
<p>Antes mesmo do navegador  receber todo o documento HTML, ela começa a tornar o renderizar o site:</p>
<p><a href="http://www.boaglio.com/go.php?http://www.boaglio.com/wp-content/uploads/2011/05/https9.png" title="(1114 hits)"><img src="http://www.boaglio.com/wp-content/uploads/2011/05/https9-1024x520.png" alt="" title="https9" width="500" height="253" class="aligncenter size-large wp-image-668" /></a></p>
<p><strong>9. O navegador envia requisições para os objetos dentro do HTML</strong></p>
<p><a href="http://www.boaglio.com/go.php?http://www.boaglio.com/wp-content/uploads/2011/05/https10.png" title="(952 hits)"><img src="http://www.boaglio.com/wp-content/uploads/2011/05/https10.png" alt="" title="https10" width="214" height="126" class="aligncenter size-full wp-image-669" /></a></p>
<p>Como o navegador processa o HTML, ele vai notar as tags que exigem busca de outras URLs. </p>
<p>O browser enviará uma requisição GET para recuperar cada um desses arquivos.</p>
<p>Aqui estão algumas URLs que a minha visita a facebook.com baixou:</p>
<p>    * Imagens</p>
<p>http://static.ak.fbcdn.net/rsrc.php/v1/yp/r/kk8dc2UJYJ4.png</p>
<p>      … &#8230;<br />
    * Folhas de estilo (CSS)</p>
<p>http://b.static.ak.fbcdn.net/rsrc.php/v1/yZ/r/dBoSKLwxlh0.css</p>
<p>http://static.ak.fbcdn.net/rsrc.php/v1/y1/r/CkuMXVTz1uq.css</p>
<p>      … &#8230;<br />
    * Arquivos JavaScript</p>
<p>http://static.ak.fbcdn.net/rsrc.php/v1/yg/r/vnWtCAcBiXn.js</p>
<p>      … &#8230; </p>
<p>Cada um desses URLs vai passar por um processo semelhante ao que a página HTML passou.<br />
Assim, o browser irá procurar o nome de domínio no DNS, enviar uma requisição para o URL, siga redirecionamentos, etc.</p>
<p>No entanto, arquivos estáticos &#8211; ao contrário de páginas dinâmicas &#8211; permitem que o navegador faça o cache deles. </p>
<p>Alguns dos arquivos podem ser acessados a partir do cache, sem contato com o servidor.<br />
O navegador sabe quanto tempo demora para colocar um arquivo em cache,  porque a resposta que retornou o arquivo continha um cabeçalho expirado.<br />
Além disso, cada resposta pode também conter um cabeçalho <a href="http://www.boaglio.com/go.php?http://en.wikipedia.org/wiki/HTTP_ETag" title="(72 hits)">ETag</a> que funciona como um número de versão &#8211; se o navegador vê um ETag para uma versão do arquivo que já possui, ele pode parar a transferência imediatamente.</p>
<p>Você consegue adivinhar o que fbcdn.net na URLs significa?  Um bom palpite seria que ela significa &#8220;Facebook content delivery network (rede de distribuição de conteúdo do Facebook)&#8221;. O Facebook usa uma rede de distribuição de conteúdo (CDN) para distribuir o conteúdo estático &#8211; imagens, folhas de estilo, e os arquivos JavaScript.  Assim, os arquivos serão copiados para muitas máquinas ao redor do mundo.</p>
<p>O conteúdo estático, muitas vezes representa a maior parte da largura de banda de um site, e pode ser facilmente replicado em um CDN. Muitas vezes, os sites usam um fornecedor de conteúdo terceirizado ao invés deles cuidarem disso. Por exemplo, arquivos estáticos do Facebook são hospedados por Akamai, o maior fornecedor de CDN.</p>
<p>Como teste, quando você tenta fazer ping static.ak.fbcdn.net, você receberá uma resposta de um servidor akamai.net.<br />
Além disso, curiosamente, se você executar ping o URL de um par de vezes, pode obter respostas de servidores diferentes, o que demonstra o balanceamento de carga, que acontece nos bastidores.</p>
<p><strong> 10. O navegador envia mais requisições assíncronas (AJAX) </strong></p>
<p><a href="http://www.boaglio.com/go.php?http://www.boaglio.com/wp-content/uploads/2011/05/https11.png" title="(937 hits)"><img src="http://www.boaglio.com/wp-content/uploads/2011/05/https11.png" alt="" title="https11" width="214" height="120" class="aligncenter size-full wp-image-670" /></a></p>
<p>No espírito da Web 2.0, o cliente continua a comunicar com o servidor, mesmo após a página ser processada.</p>
<p>Por exemplo, o chat do Facebook  continuará a atualizar a lista de seus amigos registrados logo que eles entram e saem.<br />
Para atualizar a lista de seus amigos registrados, a execução de JavaScript no seu navegador tem que enviar uma requisição assíncrona para o servidor.<br />
O pedido assíncrono é uma programação construída GET ou requisição POST que vai para um endereço especial.<br />
No exemplo do Facebook, o cliente envia uma requisição POST para http://www.facebook.com/ajax/chat/buddy_list.php para buscar a lista de seus amigos que estão online.</p>
<p>Este padrão é muitas vezes referida como &#8220;AJAX&#8221;, que significa &#8220;Asynchronous Javascript And XML&#8221;, ainda que não exista nenhuma razão específica para que o servidor tenha que formatar a resposta como XML. </p>
<p>Por exemplo, as rotinas do Facebook retornam de código JavaScript em resposta às requisições assíncronas.</p>
<p>Entre outras coisas, a ferramenta Fiddler permite visualizar os pedidos assíncronos enviados pelo seu navegador.<br />
Na verdade, não só você pode observar os pedidos de forma passiva, mas você também pode modificar e reenviá-los.<br />
O fato de que é tão fácil de &#8220;espiar&#8221; pedidos AJAX causa muita tristeza para os desenvolvedores de jogos on-line com painéis de avaliação.</p>
<p>O chat do Facebook  fornece um exemplo de um problema interessante com AJAX: empurrando dados do servidor para o cliente.  Uma vez que o HTTP é um protocolo de pedido-resposta, o servidor de chat não pode empurrar as novas mensagens para o cliente. Em vez disso, o cliente tem de consultar o servidor a cada poucos segundos para ver se alguma nova mensagem chegou.</p>
<p>O <a href="http://www.boaglio.com/go.php?http://en.wikipedia.org/wiki/Long_polling#Long_polling" title="(79 hits)">Long polling</a> é uma técnica interessante para diminuir a carga no servidor nesses tipos de cenários. Se o servidor não tem nenhuma mensagem nova, quando em polling, ele simplesmente não envia uma resposta de volta.  E, se uma mensagem para este cliente é recebida dentro do tempo limite, o servidor encontra-se a requisição pendente e retornar a mensagem com a resposta.</p>
<p><strong>Conclusão</strong></p>
<p>Esperemos que esse artigo esclareça um pouco mais de como as diferentes partes web trabalham juntas. </p>
<p>Fernando Boaglio, para a comunidade. =)</p>
<p><map name='google_ad_map_350_74531d4cc4df7f28'>
<area shape='rect' href='http://imageads.googleadservices.com/pagead/imgclick/350?pos=0' coords='1,2,367,28' />
<area shape='rect' href='http://services.google.com/feedback/abg' coords='384,10,453,23'/></map>
<img usemap='#google_ad_map_350_74531d4cc4df7f28' border='0' src='http://imageads.googleadservices.com/pagead/ads?format=468x30_aff_img&amp;client=&amp;channel=&amp;output=png&amp;cuid=350&amp;url= http%3A%2F%2Fwww.boaglio.com%2Findex.php%2F2011%2F05%2F02%2Fo-que-realmente-acontece-quando-voce-acessa-uma-url%2F' /></p><div class="al2fb_like_button"><div id="fb-root"></div><script type="text/javascript">
(function(d, s, id) {
  var js, fjs = d.getElementsByTagName(s)[0];
  if (d.getElementById(id)) return;
  js = d.createElement(s); js.id = id;
  js.src = "//connect.facebook.net/pt_BR/all.js#xfbml=1&appId=357307720952117";
  fjs.parentNode.insertBefore(js, fjs);
}(document, "script", "facebook-jssdk"));
</script>
<fb:like href="http://www.boaglio.com/index.php/2011/05/02/o-que-realmente-acontece-quando-voce-acessa-uma-url/" layout="standard" show_faces="true" width="450" action="like" font="arial" colorscheme="light" ref="AL2FB"></fb:like></div>]]></content:encoded>
			<wfw:commentRss>http://www.boaglio.com/index.php/2011/05/02/o-que-realmente-acontece-quando-voce-acessa-uma-url/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.boaglio.com/index.php/2011/05/02/o-que-realmente-acontece-quando-voce-acessa-uma-url/</feedburner:origLink></item>
		<item>
		<title>O que a Oracle não consegue comprar</title>
		<link>http://feedproxy.google.com/~r/boaglio/~3/031acGn_SJ8/</link>
		<comments>http://www.boaglio.com/index.php/2011/03/13/o-que-a-oracle-nao-consegue-comprar/#comments</comments>
		<pubDate>Sun, 13 Mar 2011 06:43:19 +0000</pubDate>
		<dc:creator>Fernando Boaglio</dc:creator>
				<category><![CDATA[banco de dados]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[KDE]]></category>
		<category><![CDATA[Oracle]]></category>

		<guid isPermaLink="false">http://www.boaglio.com/?p=636</guid>
		<description><![CDATA[No começo dos anos 90, a Digital cria um banco de dados chamado RDB que começa a ganhar uma boa fatia do mercado. Provavelmente você nunca ouviu falar dele , pois em 1994 a Oracle comprou a empresa inteira e deu um jeito de oficialmente descontinuar o produto e garantir mais uma fatia do mercado. [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.boaglio.com/go.php?http://www.boaglio.com/wp-content/uploads/2011/03/oracle_evil_empire-300x300.png" title="(1254 hits)"><img src="http://www.boaglio.com/wp-content/uploads/2011/03/oracle_evil_empire-300x300.png" alt="" title="oracle_evil_empire" width="300" height="300" class="aligncenter size-full wp-image-640" /></a></p>
<p>No começo dos anos 90, a Digital cria um banco de dados chamado <a href="http://www.boaglio.com/go.php?http://en.wikipedia.org/wiki/Oracle_Rdb" title="(118 hits)">RDB</a> que começa a ganhar uma boa fatia do mercado. Provavelmente você nunca ouviu falar dele , pois em 1994 a Oracle comprou a empresa inteira e deu um jeito de oficialmente descontinuar o produto e garantir mais uma fatia do mercado. </p>
<p><a href="http://www.boaglio.com/go.php?http://www.boaglio.com/wp-content/uploads/2011/03/bea.jpg" title="(1004 hits)"><img src="http://www.boaglio.com/wp-content/uploads/2011/03/bea.jpg" alt="" title="bea" width="136" height="82" class="aligncenter size-full wp-image-641" /></a></p>
<p>No começo dos anos 2000, uma empresa começa a ganhar nome no mercado com seu excelente servidor de aplicação chamado Weblogic. Em 2008 a Oracle compra mais essa e em alguns anos o nome da BEA cairá no esquecimento. Se eu ficar escrevendo sobre <a href="http://www.boaglio.com/go.php?http://en.wikipedia.org/wiki/Oracle_Corporation#Corporate_acquisitions" title="(334 hits)">todas as aquisições da Oracle</a>, você vai parar de ler esse artigo nesse parágrafo mesmo.</p>
<p>A linguagem Java sempre foi open source, mas a engine que roda as aplicações não ( a JVM ), e a Sun Microsystems chegou a anunciar que tinha planos para abrir o código, mas logo em seguida a empresa foi comprada pela Oracle e aparentemente os planos não mudaram e agora <a href="http://www.boaglio.com/go.php?http://www.oracle.com/us/corporate/press/176988" title="(120 hits)">todo mundo quer ajudar</a> pra quando chegar a hora levar crédito também.</p>
<p><a href="http://www.boaglio.com/go.php?http://www.boaglio.com/wp-content/uploads/2011/03/SunRIPsmall.jpg" title="(933 hits)"><img src="http://www.boaglio.com/wp-content/uploads/2011/03/SunRIPsmall-300x234.jpg" alt="" title="Sun RIP " width="300" height="234" class="aligncenter size-medium wp-image-642" /></a><br />
<!--adsense#bannertextomeio--></p>
<p>Quando se compra uma empresa e talvez até um jabá por fora para garantir que a coisa ande,  normalmente os envolvidos são poucos. Quando se fala de uma comunidade, e ainda com trabalho voluntário, o dinheiro não ajuda muito. Por esse motivo que nenhuma empresa grande é dona ou tem controle sobre o <strong>movimento open source</strong>.</p>
<p>Foi criado o projeto <a href="http://www.boaglio.com/go.php?http://en.wikipedia.org/wiki/LibreOffice#History" title="(117 hits)">LibreOffice</a> como resposta da ameaça ao projeto <em>OpenOffice</em> ser descontinuado, apesar das <a href="http://www.boaglio.com/go.php?http://arstechnica.com/open-source/news/2010/10/oracle-wants-libreoffice-members-to-leave-ooo-council.ars" title="(129 hits)">tentativas da Oracle de atrapalhar o processo</a>.</p>
<p>Também foi criado o projeto <a href="http://www.boaglio.com/go.php?http://mariadb.org/" title="(142 hits)">MariaDB</a> como resposta da compra do MySQL e da mudança de sua licença. </p>
<p>Além , disso a comunidade open source não investe o seu precioso tempo voluntário em projetos proprietários que foram abertos mas não valem a pena. As vezes essas empresas grandes podem pensar: &#8220;<a href="http://www.boaglio.com/go.php?http://news.cnet.com/IBM-to-open-source-DB2/2100-7344_3-6241694.html" title="(264 hits)">vamos abrir o fonte daquela coisa velha que a molecada open source atualiza e melhora o código pra gente</a>&#8221; . Pois é, felizmente não é assim que a coisa funciona. </p>
<p>Recentemente o framework <a href="http://www.boaglio.com/go.php?http://en.wikipedia.org/wiki/Qt_%28framework%29" title="(43 hits)">Qt</a> passou por uma onda de boatos que iria acabar justamente por um <a href="http://www.boaglio.com/go.php?http://www.bbc.co.uk/news/business-12427680" title="(237 hits)">acordo que a Nokia fez com a Microsoft</a>. Se você já usou Skype, Virtual Box ou Google Earth, então já usou o <strong>Qt</strong>, pois ele é o responsável pela parte visual. Com ele também é feito o ambiente gráfico <strong>KDE</strong>, que também muita gente desinformada achou que estaria ameaçado&#8230; em primeiro lugar o <strong>KDE</strong> e o <strong>Qt</strong> existiam antes da aquisição da Nokia e o seu responsável sempre foi a comunidade open source. Em segundo lugar, devido à importância do projeto do <strong>KDE</strong>, foi criada uma <a href="http://www.boaglio.com/go.php?http://ev.kde.org/" title="(71 hits)">entidade sem fins lucrativos que visa manter a parte legal e financeira do projeto KDE</a>. Pois é, a comunidade open source não é só um bando de moleques trabalhando de graça, é algo maior que isso que está se organizando aos poucos, por esse motivo eu acho que o mínimo que ela merece é o nosso respeito. </p>
<p><strong>Fernando Boaglio, para a comunidade</strong></p>
<p><map name='google_ad_map_636_74531d4cc4df7f28'>
<area shape='rect' href='http://imageads.googleadservices.com/pagead/imgclick/636?pos=0' coords='1,2,367,28' />
<area shape='rect' href='http://services.google.com/feedback/abg' coords='384,10,453,23'/></map>
<img usemap='#google_ad_map_636_74531d4cc4df7f28' border='0' src='http://imageads.googleadservices.com/pagead/ads?format=468x30_aff_img&amp;client=&amp;channel=&amp;output=png&amp;cuid=636&amp;url= http%3A%2F%2Fwww.boaglio.com%2Findex.php%2F2011%2F03%2F13%2Fo-que-a-oracle-nao-consegue-comprar%2F' /></p><div class="al2fb_like_button"><div id="fb-root"></div><script type="text/javascript">
(function(d, s, id) {
  var js, fjs = d.getElementsByTagName(s)[0];
  if (d.getElementById(id)) return;
  js = d.createElement(s); js.id = id;
  js.src = "//connect.facebook.net/pt_BR/all.js#xfbml=1&appId=357307720952117";
  fjs.parentNode.insertBefore(js, fjs);
}(document, "script", "facebook-jssdk"));
</script>
<fb:like href="http://www.boaglio.com/index.php/2011/03/13/o-que-a-oracle-nao-consegue-comprar/" layout="standard" show_faces="true" width="450" action="like" font="arial" colorscheme="light" ref="AL2FB"></fb:like></div>]]></content:encoded>
			<wfw:commentRss>http://www.boaglio.com/index.php/2011/03/13/o-que-a-oracle-nao-consegue-comprar/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://www.boaglio.com/index.php/2011/03/13/o-que-a-oracle-nao-consegue-comprar/</feedburner:origLink></item>
	</channel>
</rss>

