<?xml version="1.0"?>
<rss version="2.0" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:media="http://search.yahoo.com/mrss/" xmlns:yt="http://gdata.youtube.com/schemas/2007" xmlns:atom="http://www.w3.org/2005/Atom">
   <channel>
      <title>Dextra Sistemas :: RSS</title>
      <description>Pipes Output</description>
      <link>http://pipes.yahoo.com/pipes/pipe.info?_id=LrW43Qkp3hG_VMCgrbQIDg</link>
      <atom:link rel="next" href="http://pipes.yahoo.com/pipes/pipe.run?_id=LrW43Qkp3hG_VMCgrbQIDg&amp;_render=rss&amp;page=2"/>
      <pubDate>Thu, 01 Oct 2015 23:09:45 +0000</pubDate>
      <generator>http://pipes.yahoo.com/pipes/</generator>
      <item>
         <title>WINDOW FUNCTIONs no PostgreSQL</title>
         <link>http://feedproxy.google.com/~r/dextra-bd/~3/IFlRFvnM7uM/</link>
         <description>&lt;p&gt;Um  recurso presente desde a versão 8.4 do PostgreSQL, mas que muitos ainda  não conhecem ou não sabem como utilizar, são as chamadas &lt;strong&gt;WINDOW  FUNCTIONS&lt;/strong&gt;, ou, numa tradução literal, “FUNÇÕES DE JANELA”. Trata-se de  um recurso muito interessante, que foi&amp;#8230;&lt;/p&gt;</description>
         <guid isPermaLink="false">http://blogs.dextra.com.br/?p=682</guid>
         <pubDate>Mon, 28 Jan 2013 12:16:49 +0000</pubDate>
         <content:encoded><![CDATA[<p>Um  recurso presente desde a versão 8.4 do PostgreSQL, mas que muitos ainda  não conhecem ou não sabem como utilizar, são as chamadas <strong>WINDOW  FUNCTIONS</strong>, ou, numa tradução literal, “FUNÇÕES DE JANELA”. Trata-se de  um recurso muito interessante, que foi definido no padrão <a rel="nofollow" target="_blank" href="http://en.wikipedia.org/wiki/SQL:2003">SQL:2003</a>, a fim de potencializar as consultas em contextos <a rel="nofollow" target="_blank" href="http://en.wikipedia.org/wiki/OLAP">OLAP</a>.</p>
<p>Considerando  um conjunto de linhas de uma consulta, uma window function é capaz de  realizar cálculos em uma linha com base em dados presentes em linhas  relacionadas à esta (de mesmo valor, vizinhas, etc.). Nesse contexto, um  grupo de linhas correlacionadas é considerada uma janela (“window”). Na  própria consulta definimos qual serão as janelas para que uma função de  agregação trabalhe sobre a mesma.</p>
<p>Esta  funcionalidade pode ser considerada complementar às clássicas funções  de agregação (SUM, COUNT, MIN, MAX, etc.), que estão comumente  associadas à clausula GROUP BY, entretanto estas podem ser usadas também  como window function. A principal diferença é que o uso de uma window  function não faz com que o resultado seja agrupado em apenas uma linha,  podendo este ser distribuído pelas linhas presentes originalmente na  consulta. Isso possibilita alcançar resultados antes possíveis somente  com linguagens procedurais ou subconsultas.</p>
<h2 dir="ltr">Vamos à prática</h2>
<p>Para  facilitar o entendimento, consideramos como exemplo um banco de  dados que armazena a quantidade de acessos às páginas de uma empresa. De  forma simplificada, o esquema da tabela poderia ser o seguinte:</p>
<pre class="brush:sql">CREATE TABLE paginas (
  dominio text not null, -- [Sub]domínio
  url text not null,     -- URL, dentro do [sub]domínio
  acessos integer,       -- quantidade de acessos
  tags text[],           -- array de tags
  CONSTRAINT pk_paginas PRIMARY KEY (dominio, url)
);</pre>
<p>Inserindo alguns dados:</p>
<pre class="brush:sql">INSERT INTO paginas(dominio,url,acessos,tags)
VALUES
('www.example.com', '/index.html',        448, '{index,exemplo}'),
('www.example.com', '/contato.html',      201, '{contato}'),
('www.example.com', '/exemplo.html',      272, '{exemplo,teste}'),
('blog.example.com', '/index.html',       513, '{blog}'),
('blog.example.com', '/postgresql.html',  896, '{blog,postgresql}'),
('blog.example.com', '/postgres-xc.html', 1036, '{postgresql,escalabilidade}'),
('evento.example.com', '/',                640, '{evento,postgresql}'),
('evento.example.com', '/inscricao.html',  289, '{evento,inscrição}');</pre>
<h2 dir="ltr">Usando uma clássica função de agregação e o GROUP BY</h2>
<p>Verificar a quantidade média de acesso por domínio:</p>
<pre class="brush:sql">SELECT dominio, AVG(acessos) AS media_acessos
FROM paginas
GROUP BY dominio;</pre>
<pre class="brush:plain">      dominio       |     media_acessos
--------------------+----------------------
 evento.example.com | 464.5000000000000000
 www.example.com    | 307.0000000000000000
 blog.example.com   | 815.0000000000000000</pre>
<p>Basicamente, o PostgreSQL irá agrupar toda linha que possua a mesma categoria, como representado na figura:</p>
<p><a rel="nofollow" target="_blank" href="http://blogs.dextra.com.br/wp-content/uploads/2013/02/avg_agg.png"><img class="alignnone size-full wp-image-702" title="Resultado da fun&#xe7;&#xe3;o de agrega&#xe7;&#xe3;o AVG com GROUP BY" src="http://blogs.dextra.com.br/wp-content/uploads/2013/02/avg_agg.png" alt="Resultado da fun&#xe7;&#xe3;o de agrega&#xe7;&#xe3;o AVG com GROUP BY" width="592" height="208"/></a></p>
<p>&nbsp;</p>
<h2 dir="ltr">Usando WINDOW FUNCTION</h2>
<h3 dir="ltr">Definição de janela com o PARTITION BY</h3>
<p>Tendo  por base o exemplo anterior, como verificar, com uma única  consulta, a  comparação de acessos de cada URL com a média de acesso do  domínio ao  qual a mesma pertence?</p>
<pre class="brush:sql">SELECT dominio, url,
  AVG(acessos) OVER(PARTITION BY dominio) AS media_acessos
FROM paginas;</pre>
<pre class="brush:plain">       dominio      |        url        |     media_acessos
--------------------+-------------------+----------------------
 www.example.com    | /contato.html     | 307.0000000000000000
 www.example.com    | /index.html       | 307.0000000000000000
 www.example.com    | /exemplo.html     | 307.0000000000000000
 blog.example.com   | /index.html       | 815.0000000000000000
 blog.example.com   | /postgres-xc.html | 815.0000000000000000
 blog.example.com   | /postgresql.html  | 815.0000000000000000
 evento.example.com | /inscricao.html   | 464.5000000000000000
 evento.example.com | /                 | 464.5000000000000000</pre>
<p>A cláusula OVER referencia a janela que o PostgreSQL usará para realizar a agregação. A janela foi determinada usando o PARTITION BY, que, (de forma semelhante ao GROUP BY) agrupa as tuplas, fazendo com que todas do mesmo grupo, ou mesma partição, recebam o resultado da agregação. No nosso exemplo, consideramos o campo domínio como uma partição. A função AVG calcula a média para cada janela. Dessa forma, é possível manter as linhas originais apesar dos valores agregados, como mostra a figura:</p>
<p><a rel="nofollow" target="_blank" href="http://blogs.dextra.com.br/wp-content/uploads/2013/06/avg_partition_by.jpg"><img title="Resultado de window function AVG com janela PARTITION BY" src="http://blogs.dextra.com.br/wp-content/uploads/2013/06/avg_partition_by.png" alt="Resultado de window function AVG com janela PARTITION BY" width="608" height="174"/></a></p>
<h3>Definição de janela com o ORDER BY</h3>
<p>Ainda neste cenário, vamos substituir a coluna de média de acessos por ma coluna que mostre a soma parcial dos acessos. O resultado que buscamos é o seguinte:</p>
<pre class="brush:plain">      dominio       |        url        | acessos | parcial
--------------------+-------------------+---------+---------
 www.example.com    | /contato.html     |     201 |     201
 www.example.com    | /exemplo.html     |     272 |     473
 evento.example.com | /inscricao.html   |     289 |     762
 www.example.com    | /index.html       |     448 |    1210
 blog.example.com   | /index.html       |     513 |    1723
 evento.example.com | /                 |     640 |    2363
 blog.example.com   | /postgresql.html  |     896 |    3259
 blog.example.com   | /postgres-xc.html |    1036 |    4295</pre>
<p>Para tanto, podemos definir nossa janela utilizando a cláusula ORDER BY:</p>
<pre class="brush:sql">SELECT dominio, url, acessos,
SUM(acessos) OVER(ORDER BY acessos, dominio, url) AS parcial
FROM paginas
ORDER BY acessos, dominio, url;</pre>
<p>Quando  definimos uma janela com o ORDER BY, o resultado é calculado primeiro  ordenando as linhas, e, em seguida, calculando a agregação de forma  incremental, linha a linha. A figura abaixo representa essa operação:</p>
<p><a rel="nofollow" target="_blank" href="http://blogs.dextra.com.br/wp-content/uploads/2013/02/sum_parcial.png"><img class="alignnone size-full wp-image-704" title="Resultado de window function SUM com janela ORDER BY (soma parcial)" src="http://blogs.dextra.com.br/wp-content/uploads/2013/02/sum_parcial.png" alt="Resultado de window function SUM com janela ORDER BY (soma parcial)" width="506" height="195"/></a></p>
<p>E se quisermos a soma parcial e a média, ambas agrupados por domínio? Da seguinte forma:</p>
<pre>      dominio       |        url        | acessos | media_acessos | parcial
--------------------+-------------------+---------+---------------+---------
 blog.example.com   | /index.html       |     513 |         815.0 |     513
 blog.example.com   | /postgresql.html  |     896 |         815.0 |    1409
 blog.example.com   | /postgres-xc.html |    1036 |         815.0 |    2445
 evento.example.com | /inscricao.html   |     289 |         464.5 |     289
 evento.example.com | /                 |     640 |         464.5 |     929
 www.example.com    | /contato.html     |     201 |         307.0 |     201
 www.example.com    | /exemplo.html     |     272 |         307.0 |     473
 www.example.com    | /index.html       |     448 |         307.0 |     921</pre>
<p>Além de manter a função AVG com a definição PARTITION BY, a função SUM é calculada sobre janelas definidas ao mesmo tempo por PARTITION BY e ORDER BY, como segue:</p>
<pre class="brush:sql">SELECT dominio, url, acessos,
  AVG(acessos) OVER(PARTITION BY dominio) AS media_acessos,
  SUM(acessos) OVER(PARTITION BY dominio ORDER BY acessos, url) AS parcial
FROM paginas
ORDER BY dominio, acessos, url;</pre>
<h3 dir="ltr">Outras funções de agregação</h3>
<p>Como  mostrado nos exemplos acima, qualquer função de agregação já conhecida  pode ser usado como uma window function, entretanto o PostgreSQL também  oferece 11 funções específicas desta funcionalidade.</p>
<p>Por exemplo, usando a função row_number podemos adicionar um número sequencial em cada uma das linhas:</p>
<pre class="brush:sql">SELECT row_number() OVER(ORDER BY dominio, acessos, url),
  dominio, url, acessos,
  SUM(acessos) OVER(PARTITION BY dominio ORDER BY acessos, url) AS parcial
FROM paginas
ORDER BY dominio, acessos, url;</pre>
<pre class="brush:plain"> row_number |      dominio       |        url        | acessos | parcial
------------+--------------------+-------------------+---------+---------
          1 | blog.example.com   | /index.html       |     513 |     513
          2 | blog.example.com   | /postgresql.html  |     896 |    1409
          3 | blog.example.com   | /postgres-xc.html |    1036 |    2445
          4 | evento.example.com | /inscricao.html   |     289 |     289
          5 | evento.example.com | /                 |     640 |     929
          6 | www.example.com    | /contato.html     |     201 |     201
          7 | www.example.com    | /exemplo.html     |     272 |     473
          8 | www.example.com    | /index.html       |     448 |     921</pre>
<p>É possível fazer isto também por partições:</p>
<pre class="brush:sql">SELECT row_number() OVER(PARTITION BY dominio ORDER BY acessos, url),
dominio, url, acessos,
SUM(acessos) OVER(PARTITION BY dominio ORDER BY acessos, url) AS parcial
FROM paginas
ORDER BY dominio, acessos, url;</pre>
<pre class="brush:plain"> row_number |      dominio       |        url        | acessos | parcial
------------+--------------------+-------------------+---------+---------
          1 | blog.example.com   | /index.html       |     513 |     513
          2 | blog.example.com   | /postgresql.html  |     896 |    1409
          3 | blog.example.com   | /postgres-xc.html |    1036 |    2445
          1 | evento.example.com | /inscricao.html   |     289 |     289
          2 | evento.example.com | /                 |     640 |     929
          1 | www.example.com    | /contato.html     |     201 |     201
          2 | www.example.com    | /exemplo.html     |     272 |     473
          3 | www.example.com    | /index.html       |     448 |     921</pre>
<h3 dir="ltr">Conclusão</h3>
<p>WINDOW  FUNCTION é um recurso muito útil, principalmente para consultas a serem  usadas em relatórios analíticos. Vale destacar que o PostgreSQL, até a  escrita desse artigo, é o único banco de dados open-source a implementar  esta funcionalidade, o que mostra, mais uma vez, que o elefante  possui funcionalidades equiparáveis à bancos de dados comerciais.</p>
<p>Em  breve, lançaremos aqui uma continuação desse artigo, mostrando exemplos  com todas as 11 funções de janela presentes nativamente no PostgreSQL.</p>
<p>Aguarde.</p>
<img src="http://feeds.feedburner.com/~r/dextra-bd/~4/IFlRFvnM7uM" height="1" width="1" alt=""/>]]></content:encoded>
      </item>
      <item>
         <title>Epidemia dos bugs: corrigir agora ou postergar?</title>
         <link>http://feedproxy.google.com/~r/dextra-apalavradoarquiteto/~3/2bKnIDPtpss/</link>
         <description>&lt;p&gt;Elizabeth Hendrickson escreveu recentemente sobre a quantidade de horas que já gastou em reuniões de triagem de bugs – e que muitas empresas desperdiçam tempo e dinheiro em processos de testes, sem aproveitar as informações reveladas por eles, levando a&amp;#8230;&lt;/p&gt;</description>
         <guid isPermaLink="false">http://blogs.dextra.com.br/?p=664</guid>
         <pubDate>Thu, 27 Sep 2012 19:48:27 +0000</pubDate>
         <content:encoded/>
      </item>
      <item>
         <title>Novidades do PostgreSQL 9.2</title>
         <link>http://feedproxy.google.com/~r/dextra-bd/~3/kV-lMoOyhbI/</link>
         <description>&lt;p&gt;Estamos muitos próximos do lançamento da nova versão do PostgreSQL, a versão 9.2. Já no segundo beta da versão, esperamos que a versão oficial seja lançada até o final de Setembro de 2012. Vários novidades estarão presentes nesta versão, como&amp;#8230;&lt;/p&gt;</description>
         <guid isPermaLink="false">http://blogs.dextra.com.br/?p=632</guid>
         <pubDate>Fri, 03 Aug 2012 11:57:35 +0000</pubDate>
         <content:encoded><![CDATA[<p>Estamos muitos próximos do lançamento da nova versão do PostgreSQL, a versão 9.2. Já no segundo beta da versão, esperamos que a versão oficial seja lançada até o final de Setembro de 2012. Vários novidades estarão presentes nesta versão, como a tão esperada replicação em cascata, novos tipos de dados, index-only scans, o novo processo &#8220;background checkpointer&#8221;, entre muitas outras. Neste artigo vamos dar uma olhada nas principais novidades da versão 9.2.</p>
<p>&nbsp;</p>
<h2>Replicação em cascata</h2>
<p>Talvez essa seja a funcionalidade mais esperada do PostgreSQL 9.2: a possibilidade de realizar replicação em cascata.</p>
<p>As melhorias no gerenciamento de log de transações para servidores slaves de uma replicação, torna possível a execução de processos &#8220;wal sender&#8221; nestes servidores, permitindo que um servidor slave se conecte à outro servidor slave para realizar a replicação em cascata.</p>
<p><img title="Replica&#xe7;&#xe3;o em Cascata" src="http://imgs.dextra.com.br/blog_replicacao-cascata.png" alt="Replica&#xe7;&#xe3;o em Cascata" width="500" height="340"/></p>
<p>&nbsp;</p>
<p>A replicação em cascata é especialmente útil para sistemas distribuídos, conseguindo fazer com que cada servidor slave seja sincronizado a partir de outro servidor mais próximo, seja este um slave ou master. Além disso, a distribuição da replicação faz com que o uso de recursos seja reduzido no servidor master.</p>
<p>Além da replicação em cascata, a nova versão traz a possibilidade de realização de backup incremental a partir de um servidor slave. Com isso, ganha-se tanto em distribuição de tarefas quanto em segurança, podendo realizar o mesmo backup em vários pontos distintos.</p>
<p>&nbsp;</p>
<h2>Novos tipos de dados</h2>
<p>Três novos tipos de dados nativos foram incluídos na nova versão do PostgreSQL.</p>
<p>Depois do sucesso da inclusão do tipo de dados XML na versão 8.3 do PostgreSQL, agora é possível armazenar tipo de dados JSON. É claro que o conteúdo do JSON já podia ser armazenado num campo tipo <code>text</code>, entretanto o tipo de dados específico para JSON é capaz de validar e auxiliar no processamento desse tipo de informação.</p>
<p>Vários <a rel="nofollow" title="Documenta&#xe7;&#xe3;o do PostgreSQL sobre &quot;range types&quot;" target="_blank" href="http://www.postgresql.org/docs/9.2/static/rangetypes.html">tipos de dados para representação de intervalos</a> foram adicionados. Estes tipos de dados são capazes de adicionar valor inicial e final de um intervalo, podendo este intervalo ser: inteiro, decimal, data/hora ou data. Além disso, novos tipos de dados de intervalo podem ser criados com o comando <a rel="nofollow" title="CREATE TYPE na Documenta&#xe7;&#xe3;o do PostgreSQL 9.2" target="_blank" href="http://www.postgresql.org/docs/9.2/static/sql-createtype.html">CREATE TYPE</a>.</p>
<p>Além da representação, vários <a rel="nofollow" title="Lista dos operadores e fun&#xe7;&#xf5;es para &quot;range types&quot;" target="_blank" href="http://www.postgresql.org/docs/9.2/static/functions-range.html#RANGE-OPERATORS-TABLE">operadores e funções</a> foram definidos para realizar o processamento desses tipos de dados de forma mais ágil. Outro ponto importante é a possibilidade de <a rel="nofollow" title="Indexa&#xe7;&#xe3;o de &quot;range type&quot; com &#xed;ndices GiST" target="_blank" href="http://www.postgresql.org/docs/9.2/static/rangetypes.html#RANGETYPES-GIST">indexação desses dados com índices GiST</a> e a criação de <a rel="nofollow" title="&quot;Range types constraints&quot;" target="_blank" href="http://www.postgresql.org/docs/9.2/static/rangetypes.html#RANGETYPES-CONSTRAINT">restrições (&#8220;constraints&#8221;)</a> para estes dados.</p>
<p>&nbsp;</p>
<h2>Index-only scans</h2>
<p>Nas versões anteriores do PostgreSQL, os índices eram usados apenas como referência para a tabela, ou seja, para recuperar o valor buscado, sempre era necessária a busca do registro na tabela após a varredura do índice.</p>
<p>Com a funcionalidade de &#8220;index-only scans&#8221; ou &#8220;varreduras apenas em índice&#8221;, o PostgreSQL não precisa mais buscar o valor de um campo na tabela, agora ele é capaz de buscar esse valor diretamente no índice. No caso de um SELECT executado numa tabela que contém um índice com todos os campos que serão retornados (em qualquer parte da cláusula), o PostgreSQL não precisará mais buscar na tabela para devolver o resultado, este será capaz de retornar o resultado com o valor presente no índice.</p>
<p>Exemplo:</p>
<p>Criação de uma tabela para teste:</p>
<pre>postgres=# CREATE TABLE teste AS
SELECT id, md5(random()::text) AS valor1, md5(random()::text) AS valor2
FROM generate_series(1, 100000) AS id;
SELECT 100000
Time: 2639.959 ms
</pre>
<p>Criação de um índice com o campo id e valor1:</p>
<pre>postgres=# CREATE INDEX idx_teste ON teste (id, valor1);
CREATE INDEX
Time: 1336.790 ms
</pre>
<p>Busca pelo id = 90000 e retornando todos os campos:</p>
<pre>postgres=# EXPLAIN ANALYZE SELECT id, </pre>
<pre>valor1, valor2 FROM teste WHERE id = 90000;
               QUERY PLAN
-----------------------------------------------------------------------
 Index Scan using idx_teste on teste  (cost=0.00..8.56 rows=1 width=70)</pre>
<pre>(actual time=29.077..29.081 rows=1 loops=1)</pre>
<pre>   Index Cond: (id = 90000)
 Total runtime: 29.165 ms
(3 rows)

Time: 239.084 ms
</pre>
<p>O &#8220;Index Scan&#8221;, usado acima pelo PostgreSQL, é capaz de filtrar os registros pelo índice, mas deve buscar o valor na tabela.</p>
<p>Agora, buscando também pelo id = 90000, mas sem retornar o campo valor2 (que não está indexado):</p>
<pre>postgres=# EXPLAIN ANALYZE SELECT id, valor1 FROM teste WHERE id = 90000;
                                                      QUERY PLAN
----------------------------------------------------------------------------
 Index Only Scan using idx_teste on teste  (cost=0.00..8.56 rows=1 width=37)</pre>
<pre>(actual time=8.331..8.335 rows=1 loops=1)</pre>
<pre>   Index Cond: (id = 90000)
   Heap Fetches: 1
 Total runtime: 8.419 ms
(4 rows)

Time: 68.973 ms
</pre>
<p>Nesta consulta o otimizador do PostgreSQL decidiu usar a nova funcionalidade, o &#8220;Index Only Scan&#8221;, para evitar a busca dos dados na tabela.</p>
<p>&nbsp;</p>
<h2>Novo utilitário: &#8220;pg_receivexlog&#8221;</h2>
<p>O backup incremental é uma funcionalidade presente no PostgreSQL desde a versão 8.0. Esta forma de backup permite o arquivamento de logs de transação logo após um processo de CHECKPOINT. A grande vantagem dessa funcionalidade é que a mesma permite o uso da técnica de PITR (Point-In-Time Recovery), que torna possível restaurar o estado exato do servidor PostgreSQL em qualquer ponto no tempo. Para que isso aconteça, um backup base (backup dos arquivos físicos) é necessário, e o arquivamento dos logs de transação (Write-ahead-logs) a partir deste backup base.</p>
<p>O backup incremental acontece após o CHECKPOINT, que por sua vez aguarda o preenchimento dos arquivos de log de transação (<code>checkpoint_segments</code>) ou um timeout (<code>checkpoint_timeout</code>). Dessa forma, o backup permanece em atraso equivalente a algumas transações.</p>
<p>Com a versão 9.0 do PostgreSQL surgiu o conceito de replicação por fluxo de dados (streaming replication). Na 9.2, essa técnica pode ser utilizada não somente para replicação, mas também para execução do backup incremental. A ferramenta pg_receivexlog passa a fazer parte do conjunto de ferramentas administrativas do PostgreSQL, para permitir o uso do protocolo de replicação por fluxo de dados na estratégia de backup, garantindo um backup fiel ao ambiente de produção.</p>
<p>&nbsp;</p>
<h2>Melhorias na contrib &#8220;pg_stat_statements&#8221;</h2>
<p>A extensão &#8220;pg_stat_statements&#8221;, presente desde a versão 8.4 do PostgreSQL, possui uma funcionalidade de grande utilidade. Esta extensão é capaz de capturar os comandos mais lentos e mais executados no banco de dados. A grande vantagem desta extensão, se comparada à interpretadores de log de atividades, como o <a rel="nofollow" target="_blank" href="http://pgfouine.projects.postgresql.org/">pgFouine</a>, é o fato da mesma conseguir os resultados sempre em tempo real, por ser uma biblioteca carregada pelo servidor do PostgreSQL e apresentar os resultados na view pg_stat_statements.</p>
<p>Entretanto, esta não era uma extensão muito adotada, pelo fato de considerar os comandos SQL com as constantes, não agregando comandos semelhantes. Ou seja, as consultas abaixo eram consideradas diferentes para a pg_stat_statements:</p>
<pre>SELECT * FROM teste WHERE valor2 LIKE 'a%';
SELECT * FROM teste WHERE valor2 LIKE 'b%';
</pre>
<p>A versão dessa extensão para o PostgreSQL 9.2, passa a ignorar as constantes, tratando as consultas acimas como equivalentes por considerar apenas a estrutura do comando. O valor apresentado na view pg_stat_statements para a consulta acima é o seguinte:</p>
<pre>SELECT * FROM teste WHERE valor2 LIKE ?;
</pre>
<h2>Background Checkpointer</h2>
<p>O PostgreSQL é um sistema multi-processo, o que significa que vários processos são usados para o gerenciamento do banco de dados e conexões. Para cada conexão de usuário um processo filho é criado para gerenciar a mesma, e além disso, também são criados processos filhos para a execução de tarefas administrativas, como o &#8220;autovacuum launcher&#8221;, responsável por iniciar processos (novos filhos) automáticos de VACUUM.</p>
<p>No Linux, uma forma simples de encontrar todos os processos do PostgreSQL sendo executados é com o utilitário &#8220;ps&#8221;, filtrando pelos processos que são executados pelo usuário &#8220;postgres&#8221; (no caso de uma instalação padrão do PostgreSQL):</p>
<pre>$ ps f -u postgres
  PID TTY    STAT    TIME COMMAND
 2878 ?      S      53:51 /usr/local/pgsql9.2/bin/postgres -D /usr/local/pgsql9.2/data/
 3079 ?      Ss      9:10  &#92;_ postgres: logger process
 3174 ?      Ss     37:28  &#92;_ postgres: writer process
 3175 ?      Ss     27:13  &#92;_ <strong>postgres: checkpointer process</strong>
 3176 ?      Ss     27:13  &#92;_ postgres: wal writer process
 3177 ?      Ss    573:38  &#92;_ postgres: autovacuum launcher process
 3178 ?      Ss      5:50  &#92;_ postgres: archiver process   last was 000000010000000100000073
 3179 ?      Ss   1578:05  &#92;_ postgres: stats collector process
14359 ?      Ss      0:00  &#92;_ postgres: postgres postgres 172.16.129.122(34176) idle
14387 ?      Ss      0:00  &#92;_ postgres: postgres postgres 172.16.129.122(34184) idle
14395 ?      Ss      0:00  &#92;_ postgres: postgres postgres 172.16.129.122(34190) idle
</pre>
<p>Um outro processo administrativo, presente desde a versão 8.0, é o &#8220;writer&#8221; ou também conhecido como &#8220;background writer&#8221;. Este é um processo essencial para o PostgreSQL, e, até a versão 9.1 era responsável pela realização de duas tarefas:</p>
<ul>
<li>Escrita de páginas sujas no buffer de memória para o disco;</li>
<li>Execução do processo de CHECKPOINT.</li>
</ul>
<p>A partir da versão 9.2 do PostgreSQL, o &#8220;background writer&#8221; foi divido em dois processos, passando agora a ser responsável apenas pela escrita de páginas sujas em disco. Essa divisão criou um novo processo filho, o &#8220;background checkpointer&#8221;, agora responsável pela execução do CHECKPOINT.</p>
<p>Com essa divisão, espera-se melhorar a distribuição nas operações de escrita. Com isso, pode-se esperar também um ganho em desempenho, principalmente em sistemas com uso intensivo de entrada/saída (I/O bound).</p>
<p>&nbsp;</p>
<h2>Melhor escalabilidade vertical</h2>
<p>Na versão 9.2 algumas mudanças no código-fonte do PostgreSQL trouxeram grandes melhorias de desempenho, aprimorando ainda mais a escalabilidade vertical. Esta melhoria no PostgreSQL aliado à algumas atualizações no kernel 3.2 do Linux tornou esse ganho muito expressivo nessa versão. <a rel="nofollow" target="_blank" href="http://rhaas.blogspot.com.br/2012/04/did-i-say-32-cores-how-about-64.html">Testes comparando a escalabilidade do PostgreSQL 9.1 e 9.2</a> comprovaram que um grande ganho em servidores com processadores multi-núcleos de 32 e 64 núcleos.</p>
<img src="http://feeds.feedburner.com/~r/dextra-bd/~4/kV-lMoOyhbI" height="1" width="1" alt=""/>]]></content:encoded>
      </item>
      <item>
         <title>[020] Strings, E/S Formatação e parsing</title>
         <link>http://feedproxy.google.com/~r/dextra-jblog/~3/u8zAaGpKhCc/</link>
         <description>&lt;p&gt;&lt;span style=&quot;font-size:large;color:#000000;&quot;&gt;&lt;strong&gt;Bom dia pessoal,&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color:#000000;&quot;&gt;Pra matar aquela ansiedade que ficou no post anterior&amp;#8230; e que ansiedade que eu causei em&amp;#8230; quase duas semanas&amp;#8230; desculpa pessoal pelo atraso.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;#160;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size:medium;color:#000000;&quot;&gt;&lt;strong&gt;Assunto&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span style=&quot;color:#000000;&quot;&gt;Serialização e Herança&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;#160;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size:medium;color:#000000;&quot;&gt;&lt;strong&gt;Serialização e Herança&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color:#000000;&quot;&gt;&lt;strong&gt;Regras&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;</description>
         <guid isPermaLink="false">http://blogs.dextra.com.br/?p=570</guid>
         <pubDate>Fri, 18 Nov 2011 16:06:55 +0000</pubDate>
         <content:encoded><![CDATA[<p><span style="font-size:large;color:#000000;"><strong>Bom dia pessoal,</strong></span></p>
<p><span style="color:#000000;">Pra matar aquela ansiedade que ficou no post anterior&#8230; e que ansiedade que eu causei em&#8230; quase duas semanas&#8230; desculpa pessoal pelo atraso.</span></p>
<p>&nbsp;</p>
<p><span style="font-size:medium;color:#000000;"><strong>Assunto</strong></span></p>
<ul>
<li><span style="color:#000000;">Serialização e Herança</span></li>
</ul>
<p>&nbsp;</p>
<p><span style="font-size:medium;color:#000000;"><strong>Serialização e Herança</strong></span></p>
<p><span style="color:#000000;"><strong>Regras</strong></span></p>
<p style="padding-left:30px;"><span style="color:#000000;"><strong>1.</strong> Se a superclasse for Serializable, todas as subclasses também serão.</span></p>
<p style="padding-left:30px;"><span style="color:#000000;"><strong>2.</strong> Se a classe filha for Serializable, a classe pai não precisa ser obrigatoriamente Serializable.</span></p>
<p style="padding-left:30px;"><span style="color:#000000;"><strong>3.</strong> Se a classe filha for Serializable e a classe pai não for, na <strong>classe pai</strong> as variáveis serão<strong> inicializadas</strong> e o <strong>construtor será chamado</strong>.</span></p>
<p>&nbsp;</p>
<p><span style="color:#000000;"><strong>Veja um exemplo abaixo:</strong></span></p>
<p style="padding-left:30px;"><span style="color:#000000;"><span style="color:#993366;"><strong>public class</strong></span> ManipulandoSerializacaoComHeranca {</span></p>
<p style="padding-left:60px;"><span style="color:#000000;"><span style="color:#993366;"><strong>public static void</strong></span> main(String[] args) {</span></p>
<p style="padding-left:90px;"><span style="color:#000000;">Moto moto = <span style="color:#993366;"><strong>new</strong></span> Moto(<span style="color:#3366ff;">&#8220;Susuki&#8221;</span>, 240d);</span></p>
<p style="padding-left:90px;"><span style="color:#000000;"><span style="color:#993366;"><strong>try</strong></span> {</span></p>
<p style="padding-left:120px;"><span style="color:#000000;">System.<span style="color:#3366ff;"><em>out</em></span>.println(<span style="color:#3366ff;">&#8220;Antes &#8211; Moto: &#8220;</span> + moto.getMarca() +<span style="color:#3366ff;"> &#8220;, &#8220;</span> + moto.getVelocidadeMaxima() + <span style="color:#3366ff;">&#8220;, &#8221; </span>+ moto.getQuantidadeRoda());</span></p>
<p style="padding-left:120px;"><span style="color:#000000;">FileOutputStream fos = <span style="color:#993366;"><strong>new</strong></span> FileOutputStream(<span style="color:#3366ff;">&#8220;arquivo.txt&#8221;</span>);</span></p>
<p style="padding-left:120px;"><span style="color:#000000;">ObjectOutputStream oos = <span style="color:#993366;"><strong>new</strong></span> ObjectOutputStream(fos);</span></p>
<p style="padding-left:120px;"><span style="color:#000000;">oos.writeObject(moto);</span></p>
<p style="padding-left:120px;"><span style="color:#000000;">oos.close();</span></p>
<p style="padding-left:90px;"><span style="color:#000000;">} <span style="color:#993366;"><strong>catch</strong></span> (Exception e) { e.printStackTrace(); }</span></p>
<p style="padding-left:90px;"><span style="color:#000000;"><span style="color:#993366;"><strong>try</strong></span> {</span></p>
<p style="padding-left:120px;"><span style="color:#000000;">FileInputStream fis = <span style="color:#993366;"><strong>new</strong></span> FileInputStream(<span style="color:#3366ff;">&#8220;arquivo.txt&#8221;</span>);</span></p>
<p style="padding-left:120px;"><span style="color:#000000;">ObjectInputStream ois = <span style="color:#993366;"><strong>new</strong></span> ObjectInputStream(fis);</span></p>
<p style="padding-left:120px;"><span style="color:#000000;">moto = (Moto) ois.readObject();</span></p>
<p style="padding-left:120px;"><span style="color:#000000;">ois.close();</span></p>
<p style="padding-left:120px;"><span style="color:#000000;">System.<em><span style="color:#3366ff;">out</span></em>.println(<span style="color:#3366ff;">&#8220;Depois &#8211; Moto: &#8220;</span> + moto.getMarca() + <span style="color:#3366ff;">&#8220;, &#8221; </span>+ moto.getVelocidadeMaxima() +<span style="color:#3366ff;"> &#8220;, &#8220;</span> + moto.getQuantidadeRoda());</span></p>
<p style="padding-left:90px;"><span style="color:#000000;">} <span style="color:#993366;"><strong>catch</strong></span> (Exception e) { e.printStackTrace(); }</span></p>
<p style="padding-left:60px;"><span style="color:#000000;">}</span></p>
<p style="padding-left:30px;"><span style="color:#000000;">}</span></p>
<p style="padding-left:30px;"><span style="color:#000000;"><span style="color:#993366;"><strong>public class</strong></span> Automovel {</span></p>
<p style="padding-left:60px;"><span style="color:#000000;"><span style="color:#993366;"><strong>protected</strong></span> Double velocidadeMaxima;</span></p>
<p style="padding-left:60px;"><span style="color:#000000;"><span style="color:#993366;"><strong>protected</strong></span> Integer quantidadeRoda = 4;</span></p>
<p style="padding-left:60px;"><span style="color:#000000;"><span style="color:#993366;"><strong>public</strong></span> Automovel() {</span></p>
<p style="padding-left:90px;"><span style="color:#000000;">System.<span style="color:#3366ff;"><em>out</em></span>.println(<span style="color:#3366ff;">&#8220;Acesso ao construtor Automovel&#8221;</span>);</span></p>
<p style="padding-left:90px;"><span style="color:#000000;">velocidadeMaxima = 60d;</span></p>
<p style="padding-left:60px;"><span style="color:#000000;">}</span></p>
<p style="padding-left:60px;"><span style="color:#000000;"><span style="color:#993366;"><strong>public</strong></span> Double getVelocidadeMaxima() { <span style="color:#993366;"><strong>return</strong></span> velocidadeMaxima; }</span></p>
<p style="padding-left:60px;"><span style="color:#000000;"><span style="color:#993366;"><strong>public</strong></span> Integer getQuantidadeRoda() { <span style="color:#993366;"><strong>return</strong></span> quantidadeRoda; }</span></p>
<p style="padding-left:30px;"><span style="color:#000000;">}</span></p>
<p style="padding-left:30px;"><span style="color:#000000;"><span style="color:#993366;"><strong>public class</strong></span> Moto <span style="color:#993366;"><strong>extends</strong></span> Automovel <span style="color:#993366;"><strong>implements</strong></span> Serializable {</span></p>
<p style="padding-left:60px;"><span style="color:#000000;"><span style="color:#993366;"><strong>private static final</strong> <strong>long</strong></span> <span style="color:#3366ff;"><em>serialVersionUID</em></span> = -5169128571918185183L;</span></p>
<p style="padding-left:60px;"><span style="color:#000000;"><span style="color:#993366;"><strong>private</strong></span> String marca;</span></p>
<p style="padding-left:60px;"><span style="color:#000000;"><span style="color:#993366;"><strong>public</strong></span> Moto(String marca, Double velocidadeMaxima) {</span></p>
<p style="padding-left:90px;"><span style="color:#000000;"><span style="color:#993366;"><strong>this</strong></span>.quantidadeRoda = 2;</span></p>
<p style="padding-left:90px;"><span style="color:#000000;"><span style="color:#993366;"><strong>this</strong></span>.marca = marca;</span></p>
<p style="padding-left:90px;"><span style="color:#000000;"><span style="color:#993366;"><strong>this</strong></span>.velocidadeMaxima = velocidadeMaxima;</span></p>
<p style="padding-left:60px;"><span style="color:#000000;">}</span></p>
<p style="padding-left:60px;"><span style="color:#000000;"><span style="color:#993366;"><strong>public</strong></span> String getMarca() { <span style="color:#993366;"><strong>return</strong></span> marca; }</span></p>
<p style="padding-left:30px;"><span style="color:#000000;">}</span></p>
<p><strong><span style="color:#000000;">Console:</span></strong></p>
<p style="padding-left:30px;"><span style="color:#000000;">Acesso ao construtor Automovel <span style="color:#339966;">// new Moto()</span></span></p>
<p style="padding-left:30px;"><span style="color:#000000;">Antes &#8211; Moto: Susuki, 240.0, 2</span></p>
<p style="padding-left:30px;"><span style="color:#000000;">Acesso ao construtor Automovel <span style="color:#339966;">// ois.readObject()</span></span></p>
<p style="padding-left:30px;"><span style="color:#000000;">Depois &#8211; Moto: Susuki, 60.0, 4 <span style="color:#339966;">// seta os valores default</span></span></p>
<p>&nbsp;</p>
<p>&#8230;</p>
<p><span style="color:#000000;"><span style="font-size:medium;"><strong>Altere</strong></span> a classe Automovel para &#8220;<span style="color:#993366;"><strong>implements</strong></span> Serializable&#8221; e veja o resultado:</span></p>
<p><strong>Console:</strong></p>
<p style="padding-left:30px;"><span style="color:#000000;">Acesso ao construtor Automovel</span></p>
<p style="padding-left:30px;"><span style="color:#000000;">Antes &#8211; Moto: Susuki, 240.0, 2</span></p>
<p style="padding-left:30px;"><span style="color:#000000;">Depois &#8211; Moto: Susuki, 240.0, 2</span></p>
<p>Repare que o construtor Automovel não foi chamado na execução &#8220;<strong>ois.readObject()</strong>&#8221; e os valores foram mantidos.</p>
<p>&nbsp;</p>
<p><strong>É isso ai pessoal, compartilhem, comentem e estudem!</strong></p>
<p>&nbsp;</p>
<p><em>Escrito por Marcos Oto Picarelli Prado</em></p>
<img src="http://feeds.feedburner.com/~r/dextra-jblog/~4/u8zAaGpKhCc" height="1" width="1" alt=""/>]]></content:encoded>
      </item>
      <item>
         <title>[019] Strings, E/S Formatação e parsing</title>
         <link>http://feedproxy.google.com/~r/dextra-jblog/~3/ZanDxLpcOjY/</link>
         <description>&lt;p&gt;&lt;span style=&quot;font-size:large;color:#000000;&quot;&gt;&lt;strong&gt;Bom dia pessoal,&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color:#000000;&quot;&gt;Hoje vamos ver Serialização que é bem utilizado na nossa realidade de desenvolvimento de projetos.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color:#000000;&quot;&gt;O que iremos ver será especificamente para a Certificação, não estenderei o conteúdo&amp;#8230; Mas sintam-se à vontade para perguntar sobre o assunto.&lt;/span&gt;&amp;#8230;&lt;/p&gt;</description>
         <guid isPermaLink="false">http://blogs.dextra.com.br/?p=568</guid>
         <pubDate>Tue, 25 Oct 2011 23:34:48 +0000</pubDate>
         <content:encoded><![CDATA[<p><span style="font-size:large;color:#000000;"><strong>Bom dia pessoal,</strong></span></p>
<p><span style="color:#000000;">Hoje vamos ver Serialização que é bem utilizado na nossa realidade de desenvolvimento de projetos.</span></p>
<p><span style="color:#000000;">O que iremos ver será especificamente para a Certificação, não estenderei o conteúdo&#8230; Mas sintam-se à vontade para perguntar sobre o assunto.</span></p>
<p>&nbsp;</p>
<p><span style="font-size:medium;"><strong><span style="color:#000000;">O que é Serialização?</span></strong></span></p>
<p><span style="color:#000000;"><strong>Serialização</strong> é guardar o estado de um objeto em <strong>bytes</strong> seja em disco ou em um <strong>stream</strong>.</span></p>
<p>&nbsp;</p>
<p><span style="font-size:medium;"><strong><span style="color:#000000;">Classes e métodos importantes</span></strong></span></p>
<p style="padding-left:30px;"><span style="color:#000000;"><strong>1. FileInputStream</strong> &#8211; Utilizada para ler <strong>bytes</strong> e transformar em objetos.</span></p>
<p style="padding-left:30px;"><span style="color:#000000;"><strong>2. FileOutputStream</strong> &#8211; Utilizada para escrever objetos em <strong>bytes</strong> e guardar no disco.</span></p>
<p style="padding-left:30px;"><span style="color:#000000;"><strong>3. ObjectInputStream </strong>- Classe de nível mais alto, ou seja, classe de encapsulamento. Nesse caso encapsula a classe <strong>FileInputStream</strong>.</span></p>
<p style="padding-left:60px;"><span style="color:#000000;"><strong>3.1. readObject</strong> &#8211; método responsável por ler <strong>bytes</strong> e transformar em objeto.</span></p>
<p style="padding-left:60px;"><span style="color:#000000;"><strong>3.2. defaultReadObject</strong> &#8211; inicia processo de deserialização.</span></p>
<p style="padding-left:60px;"><span style="color:#000000;"><strong>3.3. readInt</strong> &#8211; retornar um valor <strong>int</strong> da deserialização.</span></p>
<p style="padding-left:30px;"><span style="color:#000000;"><strong>4. ObjectOutputStream</strong> &#8211; Classe de nível mais alto, ou seja classe de encapsulamento. Nesse caso encapsula a classe <strong>FileOutputStream</strong>.</span></p>
<p style="padding-left:60px;"><span style="color:#000000;"><strong>4.1. writeObject</strong> &#8211; método responsável por transformar o objeto em <strong>bytes</strong> no disco.</span></p>
<p style="padding-left:60px;"><span style="color:#000000;"><strong>4.2. defaultWriteObject</strong> &#8211; inicia processo de serialização.</span></p>
<p style="padding-left:60px;"><span style="color:#000000;"><strong>4.3. writeInt</strong> &#8211; escreve um valor int na serialização.</span></p>
<p style="padding-left:30px;"><span style="color:#000000;"><strong>5. Serializable</strong> &#8211; Interface que indica se uma classe é serializável.</span></p>
<p>&nbsp;</p>
<p><span style="font-size:medium;"><strong><span style="color:#000000;">Considerações</span></strong></span></p>
<p style="padding-left:30px;"><span style="color:#000000;"><strong>1.</strong> Na deserialização não é chamado o construtor da classe do objeto deserializado, MAS quando houver herança teremos um comportamento diferente (fica para o próximo post para lhes deixarem curiosos =D).<br /></span></p>
<p>&nbsp;</p>
<p><span style="font-size:medium;"><strong><span style="color:#000000;">Como serializar um objeto?</span></strong></span></p>
<p><span style="color:#000000;">Vamos ver um exemplo bem simples :</span></p>
<p style="padding-left:30px;"><span style="color:#000000;"><span style="color:#993366;"><strong>public class</strong></span> ManipulandoSerializacaoSimples {</span></p>
<p style="padding-left:60px;"><span style="color:#000000;"><span style="color:#993366;"><strong>public static void</strong></span> main(String[] args) {</span></p>
<p style="padding-left:90px;"><span style="color:#000000;">Pessoa pessoa = <span style="color:#993366;"><strong>new</strong></span> Pessoa(<span style="color:#3366ff;">&#8220;Dextrino&#8221;</span>, <strong><span style="color:#993366;">new</span></strong> Endereco(<span style="color:#3366ff;">&#8220;Campinas&#8221;</span>, <span style="color:#3366ff;">&#8220;SP&#8221;</span>, <span style="color:#3366ff;">&#8220;Brasil&#8221;</span>));</span></p>
<p style="padding-left:90px;"><span style="color:#000000;"><span style="color:#993366;"><strong>try</strong></span> {</span></p>
<p style="padding-left:120px;"><span style="color:#000000;">System.<span style="color:#3366ff;"><em>out</em></span>.println(<span style="color:#3366ff;">&#8220;Antes &#8211; Pessoa: &#8220;</span> + pessoa.getNome() + <span style="color:#3366ff;">&#8220;, &#8220;</span> + pessoa.getEndereco().getEnderecoCompleto());</span></p>
<p style="padding-left:120px;"><span style="color:#000000;">FileOutputStream fos = <strong><span style="color:#993366;">new</span></strong> FileOutputStream(<span style="color:#3366ff;">&#8220;arquivo.txt&#8221;</span>);</span></p>
<p style="padding-left:120px;"><span style="color:#000000;">ObjectOutputStream oos = <strong><span style="color:#993366;">new</span></strong> ObjectOutputStream(fos);</span></p>
<p style="padding-left:120px;"><span style="color:#000000;"><span style="color:#339966;">// Escreve o objeto pessoa no arquivo.txt</span><br /></span></p>
<p style="padding-left:120px;"><span style="color:#000000;">oos.writeObject(pessoa);</span></p>
<p style="padding-left:120px;"><span style="color:#000000;">oos.close();</span></p>
<p style="padding-left:90px;"><span style="color:#000000;">} catch (Exception e) { e.printStackTrace(); }</span></p>
<p style="padding-left:90px;"><span style="color:#000000;"><strong><span style="color:#993366;">try</span></strong> {</span></p>
<p style="padding-left:120px;"><span style="color:#000000;">FileInputStream fis = <strong><span style="color:#993366;">new</span></strong> FileInputStream(<span style="color:#3366ff;">&#8220;arquivo.txt&#8221;</span>);</span></p>
<p style="padding-left:120px;"><span style="color:#000000;">ObjectInputStream ois = <strong><span style="color:#993366;">new</span></strong> ObjectInputStream(fis);</span></p>
<p style="padding-left:120px;"><span style="color:#339966;">// Le o arquivo.txt e referencia o objeto pessoa</span></p>
<p style="padding-left:120px;"><span style="color:#000000;">pessoa = (Pessoa) ois.readObject();</span></p>
<p style="padding-left:120px;"><span style="color:#000000;">ois.close();</span></p>
<p style="padding-left:120px;"><span style="color:#000000;"><span style="color:#339966;">// Repare que a classe Endereco implementa Serializable, portanto o atributo endereco foi serializado e deserializado</span><br /></span></p>
<p style="padding-left:120px;"><span style="color:#000000;">System.<span style="color:#3366ff;"><em>out</em></span>.println(<span style="color:#3366ff;">&#8220;Depois &#8211; Pessoa: &#8220;</span> + pessoa.getNome() + <span style="color:#3366ff;">&#8220;, &#8220;</span> + pessoa.getEndereco().getEnderecoCompleto());</span></p>
<p style="padding-left:90px;"><span style="color:#000000;">} <strong><span style="color:#993366;">catch</span></strong> (Exception e) { e.printStackTrace(); }</span></p>
<p style="padding-left:60px;"><span style="color:#000000;">}</span></p>
<p style="padding-left:30px;"><span style="color:#000000;">}</span></p>
<p style="padding-left:30px;"><span style="color:#000000;"><span style="color:#993366;"><strong>public class</strong></span> Pessoa <strong><span style="color:#993366;">implements</span></strong> Serializable {</span></p>
<p style="padding-left:60px;"><span style="color:#000000;"><strong><span style="color:#993366;">private static final long</span></strong> <span style="color:#3366ff;"><em>serialVersionUID</em></span> = 619337379561831879L;</span></p>
<p style="padding-left:60px;"><span style="color:#000000;"><strong><span style="color:#993366;">private</span></strong> String nome;</span></p>
<p style="padding-left:60px;"><span style="color:#000000;"><strong><span style="color:#993366;">private</span></strong> Endereco endereco;</span></p>
<p style="padding-left:60px;"><span style="color:#000000;"><strong><span style="color:#993366;">public</span></strong> Pessoa(String nome, Endereco endereco) {</span></p>
<p style="padding-left:90px;"><span style="color:#000000;"><span style="color:#993366;"><strong>this</strong></span>.nome = nome;</span></p>
<p style="padding-left:90px;"><span style="color:#000000;"><span style="color:#993366;"><strong>this</strong></span>.endereco = endereco;</span></p>
<p style="padding-left:60px;"><span style="color:#000000;">}</span></p>
<p style="padding-left:60px;"><span style="color:#000000;"><span style="color:#993366;"><strong>public</strong></span> String getNome() { <span style="color:#993366;"><strong>return</strong></span> nome; }</span></p>
<p style="padding-left:60px;"><span style="color:#000000;"><span style="color:#993366;"><strong>public</strong></span> Endereco getEndereco() { <span style="color:#993366;"><strong>return</strong></span> endereco; }</span></p>
<p style="padding-left:30px;"><span style="color:#000000;">}</span></p>
<p style="padding-left:30px;"><span style="color:#000000;"><strong><span style="color:#993366;">public class</span></strong> Endereco <span style="color:#993366;"><strong>implements</strong></span> Serializable {</span></p>
<p style="padding-left:60px;"><span style="color:#000000;"><span style="color:#993366;"><strong>private static final long</strong></span> <span style="color:#3366ff;"><em>serialVersionUID</em></span> = -9092198905086132027L;</span></p>
<p style="padding-left:60px;"><span style="color:#000000;"><strong><span style="color:#993366;">private</span></strong> String cidade, estado, pais;</span></p>
<p style="padding-left:60px;"><span style="color:#000000;"><span style="color:#993366;"><strong>public</strong></span> Endereco(String cidade, String estado, String pais) {</span></p>
<p style="padding-left:90px;"><span style="color:#000000;"><span style="color:#993366;"><strong>this</strong></span>.cidade = cidade;</span></p>
<p style="padding-left:90px;"><span style="color:#000000;"><span style="color:#993366;"><strong>this</strong></span>.estado = estado;</span></p>
<p style="padding-left:90px;"><span style="color:#000000;"><span style="color:#993366;"><strong>this</strong></span>.pais = pais;</span></p>
<p style="padding-left:60px;"><span style="color:#000000;">}</span></p>
<p style="padding-left:60px;"><span style="color:#000000;"><span style="color:#993366;"><strong>public</strong></span> String getCidade() { <span style="color:#993366;"><strong>return</strong></span> cidade; }</span></p>
<p style="padding-left:60px;"><span style="color:#000000;"><span style="color:#993366;"><strong>public</strong></span> String getEstado() { <span style="color:#993366;"><strong>return</strong></span> estado; }</span></p>
<p style="padding-left:60px;"><span style="color:#000000;"><span style="color:#993366;"><strong>public</strong></span> String getPais() { <span style="color:#993366;"><strong>return</strong></span> pais; }</span></p>
<p style="padding-left:60px;"><span style="color:#000000;"><span style="color:#993366;"><strong>public</strong></span> String getEnderecoCompleto() { <span style="color:#993366;"><strong>return</strong></span> cidade + <span style="color:#3366ff;">&#8220;-&#8221;</span> + estado + <span style="color:#3366ff;">&#8220;, &#8220;</span> + pais; }</span></p>
<p style="padding-left:30px;"><span style="color:#000000;">}</span></p>
<p>&nbsp;</p>
<p><span style="font-size:medium;"><strong>Considerações</strong></span></p>
<p style="padding-left:30px;"><strong>1.</strong> Se a classe Endereco não fosse Serializable ocorreria a seguinte exceção:</p>
<p style="padding-left:60px;">java.io.NotSerializableException: br.com.certificacao.Endereco</p>
<p style="padding-left:30px;">&nbsp;</p>
<p><span style="font-size:medium;"><strong><span style="color:#000000;">Mas e se apenas quiséssemos que um atributo de endereço fosse serializado?</span></strong></span></p>
<p><span style="color:#000000;">Utilizaríamos a palavra-chave <strong>transiente</strong> e reimplementaríamos os métodos <strong>writeObject</strong> e <strong>readObject</strong>.</span></p>
<p>&nbsp;</p>
<p><span style="font-size:medium;"><strong><span style="color:#000000;">Vejamos um exemplo com Produto e Embalagem.</span></strong></span></p>
<p style="padding-left:30px;"><span style="color:#000000;"><span style="color:#993366;"><strong>public class</strong></span> ManipulandoSerializacaoComTransiente {</span></p>
<p style="padding-left:60px;"><span style="color:#000000;"><span style="color:#993366;"><strong>public static void</strong></span> main(String[] args) {</span></p>
<p style="padding-left:90px;"><span style="color:#000000;">Produto produto = <span style="color:#993366;"><strong>new</strong></span> Produto(<span style="color:#3366ff;">&#8220;Dextrino&#8221;</span>, <span style="color:#993366;"><strong>new</strong></span> Embalagem(<span style="color:#3366ff;">&#8220;Caixa com 10 unidades&#8221;</span>, 10));</span></p>
<p style="padding-left:90px;"><span style="color:#000000;"><span style="color:#993366;"><strong>try</strong></span> {</span></p>
<p style="padding-left:120px;"><span style="color:#000000;">System.out.println(<span style="color:#3366ff;">&#8220;Antes &#8211; Produto: &#8220;</span> + produto.getNome() + <span style="color:#3366ff;">&#8220;, &#8220;</span> + produto.getEmbalagem().getQuantidade());</span></p>
<p style="padding-left:120px;"><span style="color:#000000;">FileOutputStream fos = <span style="color:#993366;"><strong>new</strong></span> FileOutputStream(<span style="color:#3366ff;">&#8220;arquivo.txt&#8221;</span>);</span></p>
<p style="padding-left:120px;"><span style="color:#000000;">ObjectOutputStream oos = <span style="color:#993366;"><strong>new</strong></span> ObjectOutputStream(fos);</span></p>
<p style="padding-left:120px;"><span style="color:#000000;">oos.writeObject(produto);</span></p>
<p style="padding-left:120px;"><span style="color:#000000;">oos.close();</span></p>
<p style="padding-left:90px;"><span style="color:#000000;">} <span style="color:#993366;"><strong>catch</strong></span> (Exception e) { e.printStackTrace(); }</span></p>
<p style="padding-left:90px;"><span style="color:#000000;"><span style="color:#993366;"><strong>try</strong></span> {</span></p>
<p style="padding-left:120px;"><span style="color:#000000;">FileInputStream fis = <span style="color:#993366;"><strong>new</strong></span> FileInputStream(<span style="color:#3366ff;">&#8220;arquivo.txt&#8221;</span>);</span></p>
<p style="padding-left:120px;"><span style="color:#000000;">ObjectInputStream ois = <span style="color:#993366;"><strong>new</strong></span> ObjectInputStream(fis);</span></p>
<p style="padding-left:120px;"><span style="color:#000000;">produto = (Produto) ois.readObject();</span></p>
<p style="padding-left:120px;"><span style="color:#000000;">ois.close();</span></p>
<p style="padding-left:120px;"><span style="color:#000000;">System.<em><span style="color:#3366ff;">out</span></em>.println(<span style="color:#3366ff;">&#8220;Depois &#8211; Produto: &#8220;</span> + produto.getNome() + <span style="color:#3366ff;">&#8220;, &#8220;</span> + produto.getEmbalagem().getQuantidade());</span></p>
<p style="padding-left:90px;"><span style="color:#000000;">} <span style="color:#993366;"><strong>catch</strong></span> (Exception e) { e.printStackTrace(); }</span></p>
<p style="padding-left:60px;"><span style="color:#000000;">}</span></p>
<p style="padding-left:30px;"><span style="color:#000000;">}</span></p>
<p style="padding-left:30px;"><span style="color:#000000;"><span style="color:#993366;"><strong>public class</strong></span> Produto <span style="color:#993366;"><strong>implements</strong></span> Serializable {</span></p>
<p style="padding-left:60px;"><span style="color:#000000;"><span style="color:#993366;"><strong>private static final long</strong></span> <em><span style="color:#3366ff;">serialVersionUID</span></em> = 8973295619843486332L;</span></p>
<p style="padding-left:60px;"><span style="color:#000000;"><span style="color:#993366;"><strong>private</strong></span> String nome;</span></p>
<p style="padding-left:60px;"><span style="color:#000000;"><span style="color:#993366;"><strong>private</strong></span> transient Embalagem embalagem;</span></p>
<p style="padding-left:60px;"><span style="color:#000000;"><span style="color:#993366;"><strong>public</strong></span> Produto(String nome, Embalagem embalagem) {</span></p>
<p style="padding-left:90px;"><span style="color:#000000;"><span style="color:#993366;"><strong>this</strong></span>.nome = nome;</span></p>
<p style="padding-left:90px;"><span style="color:#000000;"><span style="color:#993366;"><strong>this</strong></span>.embalagem = embalagem;</span></p>
<p style="padding-left:60px;"><span style="color:#000000;">}</span></p>
<p style="padding-left:60px;"><span style="color:#000000;"><span style="color:#993366;"><strong>public</strong></span> String getNome() { <span style="color:#993366;"><strong>return</strong></span> nome; }</span></p>
<p style="padding-left:60px;"><span style="color:#000000;"><span style="color:#993366;"><strong>public</strong></span> Embalagem getEmbalagem() { <span style="color:#993366;"><strong>return</strong></span> embalagem; }</span></p>
<p style="padding-left:60px;"><span style="color:#339966;">// SO serializamos o atributo quantidade do atributo endereco</span></p>
<p style="padding-left:60px;"><span style="color:#000000;"><span style="color:#993366;"><strong>private void</strong></span> writeObject(ObjectOutputStream oos) {</span></p>
<p style="padding-left:90px;"><span style="color:#000000;"><span style="color:#993366;"><strong>try</strong></span> {</span></p>
<p style="padding-left:120px;"><span style="color:#000000;">oos.defaultWriteObject();</span></p>
<p style="padding-left:120px;"><span style="color:#000000;">oos.writeInt(embalagem.getQuantidade());</span></p>
<p style="padding-left:90px;"><span style="color:#000000;">} <span style="color:#993366;"><strong>catch</strong></span> (IOException e) { e.printStackTrace(); }</span></p>
<p style="padding-left:60px;"><span style="color:#000000;">}</span></p>
<p style="padding-left:60px;"><span style="color:#339966;">// SO deserializamos o atributo quantidade do atributo endereco</span></p>
<p style="padding-left:60px;"><span style="color:#000000;"><span style="color:#993366;"><strong>private void</strong></span> readObject(ObjectInputStream ois) {</span></p>
<p style="padding-left:90px;"><span style="color:#000000;"><span style="color:#993366;"><strong>try</strong></span> {</span></p>
<p style="padding-left:120px;"><span style="color:#000000;">ois.defaultReadObject();</span></p>
<p style="padding-left:120px;"><span style="color:#000000;">embalagem = <span style="color:#993366;"><strong>new</strong></span> Embalagem(<span style="color:#993366;"><strong>null</strong></span>, ois.readInt());</span></p>
<p style="padding-left:90px;"><span style="color:#000000;">} <span style="color:#993366;"><strong>catch</strong></span> (Exception e) { e.printStackTrace(); }</span></p>
<p style="padding-left:60px;"><span style="color:#000000;">}</span></p>
<p style="padding-left:30px;"><span style="color:#000000;">}</span></p>
<p style="padding-left:30px;"><span style="color:#000000;"><span style="color:#993366;"><strong>public class</strong></span> Embalagem {</span></p>
<p style="padding-left:60px;"><span style="color:#000000;"><span style="color:#993366;"><strong>private</strong></span> String descricao;</span></p>
<p style="padding-left:60px;"><span style="color:#000000;"><span style="color:#993366;"><strong>private</strong></span> Integer quantidade;</span></p>
<p style="padding-left:60px;"><span style="color:#000000;"><span style="color:#993366;"><strong>public</strong></span> Embalagem(String descricao, Integer quantidade) {</span></p>
<p style="padding-left:90px;"><span style="color:#000000;"><span style="color:#993366;"><strong>this</strong></span>.descricao = descricao;</span></p>
<p style="padding-left:90px;"><span style="color:#000000;"><span style="color:#993366;"><strong>this</strong></span>.quantidade = quantidade;</span></p>
<p style="padding-left:60px;"><span style="color:#000000;">}</span></p>
<p style="padding-left:60px;"><span style="color:#000000;"><span style="color:#993366;"><strong>public</strong></span> String getDescricao() { <span style="color:#993366;"><strong>return</strong></span> descricao; }</span></p>
<p style="padding-left:60px;"><span style="color:#000000;"><span style="color:#993366;"><strong>public</strong></span> Integer getQuantidade() { <span style="color:#993366;"><strong>return</strong></span> quantidade; }</span></p>
<p style="padding-left:30px;"><span style="color:#000000;">}</span></p>
<p style="padding-left:30px;">&nbsp;</p>
<p>No próximo post iremos ver <strong>Serialização</strong> com <strong>herança</strong> e suas pegadinhas&#8230; até mais.</p>
<p>&nbsp;</p>
<p><strong>É isso ai pessoal, compartilhem, comentem e estudem!</strong></p>
<p>&nbsp;</p>
<p><em>Escrito por Marcos Oto Picarelli Prado</em></p>
<img src="http://feeds.feedburner.com/~r/dextra-jblog/~4/ZanDxLpcOjY" height="1" width="1" alt=""/>]]></content:encoded>
      </item>
      <item>
         <title>[018] Strings, E/S Formatação e parsing</title>
         <link>http://feedproxy.google.com/~r/dextra-jblog/~3/ruzdMfhGA9M/</link>
         <description>&lt;p&gt;&lt;span style=&quot;font-size:large;&quot;&gt;&lt;strong&gt;Bom dia pessoal,&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Hoje vamos falar um pouco sobre o pacote &lt;strong&gt;java.io&lt;/strong&gt;. Um pacote que nos fornece possibilidades de trabalhar com entrada e saída de dados e serialização. Mas hoje iremos trabalhar apenas com manipulação de arquivos e diretórios, lembrando&amp;#8230;&lt;/p&gt;</description>
         <guid isPermaLink="false">http://blogs.dextra.com.br/?p=545</guid>
         <pubDate>Tue, 04 Oct 2011 23:10:29 +0000</pubDate>
         <content:encoded><![CDATA[<p><span style="font-size:large;"><strong>Bom dia pessoal,</strong></span></p>
<p>Hoje vamos falar um pouco sobre o pacote <strong>java.io</strong>. Um pacote que nos fornece possibilidades de trabalhar com entrada e saída de dados e serialização. Mas hoje iremos trabalhar apenas com manipulação de arquivos e diretórios, lembrando que nosso conceito é focado na certificação.</p>
<p>&nbsp;</p>
<p><span style="font-size:medium;"><strong>Assuntos</strong></span></p>
<ul>
<li>Manipulando arquivos</li>
<li>Manipulando diretórios</li>
</ul>
<p>&nbsp;</p>
<p><span style="font-size:medium;"><strong>Classes que estudaremos para a Certificação</strong></span></p>
<ul>
<li><strong>File </strong>– Essa classe é uma representação abstrata de nomes de arquivos e diretórios.</li>
<li><strong>FileReader </strong>– Essa classe é responsável para ler arquivos de caracteres.</li>
<li><strong>BufferedReader </strong>– Essa classe é usada para tornar classes Reader como FileReader fáceis de serem usadas.</li>
<li><strong>FileWriter </strong>– Essa classe é usada para escrever em arquivos de caracteres.</li>
<li><strong>BufferedWriter </strong>– Essa classe é usada para tornar classes Writer como FileWriter fáceis de serem usadas.</li>
<li><strong>PrintWriter </strong>– Essa classe é usada para tornar classes Writer como FileWriter fáceis de serem usadas.</li>
</ul>
<p>&nbsp;</p>
<p>Estudaremos essas classes na prática&#8230; <strong>(veja as dicas no final)</strong></p>
<p>&nbsp;</p>
<p><span style="font-size:large;"><strong>1. Manipulando Arquivos</strong></span></p>
<p>&nbsp;</p>
<p><span style="font-size:medium;"><strong>1.1. File</strong></span></p>
<p style="padding-left:30px;"><span style="color:#993366;"><strong>public static void</strong></span> main(String[] args) {</p>
<p style="padding-left:60px;"><span style="color:#339966;">// Da o nome a um arquivo</span></p>
<p style="padding-left:60px;">File file001 = <span style="color:#993366;"><strong>new </strong></span>File(<span style="color:#3366ff;">&#8220;teste-001.txt&#8221;</span>);</p>
<p style="padding-left:60px;"><em>criacaoDeArquivoComFile</em>(file001);</p>
<p style="padding-left:30px;">}</p>
<p style="padding-left:30px;"><span style="color:#993366;"><strong>private static void</strong></span> criacaoDeArquivoComFile(File file) {</p>
<p style="padding-left:60px;"><span style="color:#993366;"><strong>try </strong></span>{</p>
<p style="padding-left:90px;"><span style="color:#339966;">// Verifica se existe o arquivo</span></p>
<p style="padding-left:90px;">System.<span style="color:#3366ff;"><em>out</em></span>.println(file.exists());</p>
<p style="padding-left:90px;"><span style="color:#339966;">// Cria o arquivo teste.txt caso nao exista</span></p>
<p style="padding-left:90px;">file.createNewFile();</p>
<p style="padding-left:90px;"><span style="color:#339966;">// Verifica se existe o arquivo</span></p>
<p style="padding-left:90px;">System.<span style="color:#3366ff;"><em>out</em></span>.println(file.exists());</p>
<p style="padding-left:60px;">} <span style="color:#993366;"><strong>catch </strong></span>(IOException e) {</p>
<p style="padding-left:90px;">e.printStackTrace();</p>
<p style="padding-left:60px;">}</p>
<p style="padding-left:30px;">}</p>
<p style="padding-left:30px;">&nbsp;</p>
<p><span style="font-size:medium;"><strong>1.2. FileWriter e FileReader</strong></span></p>
<p style="padding-left:30px;"><span style="color:#993366;"><strong>public static void</strong></span> main(String[] args) {</p>
<p style="padding-left:60px;">File file002 = <span style="color:#993366;"><strong>new </strong></span>File(<span style="color:#3366ff;">&#8220;teste-002.txt&#8221;</span>); <span style="color:#339966;">// Da o nome a um arquivo</span></p>
<p style="padding-left:60px;"><em>utilizandoWrapperFileWriter</em>(file002);</p>
<p style="padding-left:60px;"><em>utilizandoWrapperFileReader</em>(file002);</p>
<p style="padding-left:30px;">}</p>
<p style="padding-left:30px;"><span style="color:#993366;"><strong>private static void</strong></span> utilizandoWrapperFileWriter(File file) {</p>
<p style="padding-left:60px;"><span style="color:#993366;"><strong>try </strong></span>{</p>
<p style="padding-left:90px;"><span style="color:#339966;">// Cria o arquivo teste.txt</span></p>
<p style="padding-left:90px;">FileWriter fw = <span style="color:#993366;"><strong>new </strong></span>FileWriter(file);</p>
<p style="padding-left:90px;"><span style="color:#339966;">// escreve no arquivo</span></p>
<p style="padding-left:90px;">fw.write(<span style="color:#3366ff;">&#8220;primeira frase FileWriter&#92;nsegunda frase FileWriter&#8221;</span>);</p>
<p style="padding-left:90px;"><span style="color:#339966;">// garante que a ultima parte (buffer) foi entregue ao arquivo</span></p>
<p style="padding-left:90px;">fw.flush();</p>
<p style="padding-left:90px;"><span style="color:#339966;">// libera recursos do S.O. utilizado</span></p>
<p style="padding-left:90px;">fw.close();</p>
<p style="padding-left:60px;">} <span style="color:#993366;"><strong>catch </strong></span>(IOException e) {</p>
<p style="padding-left:90px;">e.printStackTrace();</p>
<p style="padding-left:60px;">}</p>
<p style="padding-left:30px;">}</p>
<p style="padding-left:30px;"><span style="color:#993366;"><strong>private static void</strong></span> utilizandoWrapperFileReader(File file) {</p>
<p style="padding-left:60px;"><span style="color:#993366;"><strong>try </strong></span>{</p>
<p style="padding-left:90px;"><span style="color:#993366;"><strong>char</strong></span>[] entrada = new char[50];</p>
<p style="padding-left:90px;"><span style="color:#339966;">// obtem o arquivo teste-002.txt</span></p>
<p style="padding-left:90px;">FileReader fr = <span style="color:#993366;"><strong>new </strong></span>FileReader(file);</p>
<p style="padding-left:90px;"><span style="color:#339966;">// Le a quantidade de  bytes que tem o arquivo e dissolve cada caracter no array</span></p>
<p style="padding-left:90px;"><span style="color:#993366;"><strong>int </strong></span>quantidadeDeBytes = fr.read(entrada);</p>
<p style="padding-left:90px;">System.<span style="color:#3366ff;"><em>out</em></span>.println(<span style="color:#3366ff;">&#8220;Quantidade de bytes: &#8220;</span> + quantidadeDeBytes);</p>
<p style="padding-left:90px;"><span style="color:#993366;"><strong>for </strong></span>(<strong><span style="color:#993366;">char </span></strong>c : entrada) {</p>
<p style="padding-left:120px;">System.<em><span style="color:#3366ff;">out</span></em>.print(c);</p>
<p style="padding-left:90px;">}</p>
<p style="padding-left:90px;"><span style="color:#339966;">// libera recursos do S.O. utilizado</span></p>
<p style="padding-left:90px;">fr.close();</p>
<p style="padding-left:60px;">} <span style="color:#993366;"><strong>catch </strong></span>(IOException e) {</p>
<p style="padding-left:90px;">e.printStackTrace();</p>
<p style="padding-left:60px;">}</p>
<p style="padding-left:30px;">}</p>
<p>&nbsp;</p>
<p><span style="font-size:medium;"><strong>1.3. PrintWriter, FileReader e BufferedReader</strong></span></p>
<p style="padding-left:30px;"><span style="color:#993366;"><strong>public static void</strong></span> main(String[] args) {</p>
<p style="padding-left:60px;"><span style="color:#339966;">// Da o nome a um arquivo</span></p>
<p style="padding-left:60px;">File file003 = <span style="color:#993366;"><strong>new </strong></span>File(&#8220;teste-003.txt&#8221;);</p>
<p style="padding-left:60px;"><em>utilizandoWrapperPrintWriter</em>(file003);</p>
<p style="padding-left:60px;"><em>utilizandoWrapperBufferedReader</em>(file003);</p>
<p style="padding-left:30px;">}</p>
<p style="padding-left:30px;">&nbsp;</p>
<p style="padding-left:30px;"><span style="color:#993366;"><strong>private static void</strong></span> utilizandoWrapperPrintWriter(File file) {</p>
<p style="padding-left:60px;"><span style="color:#993366;"><strong>try </strong></span>{</p>
<p style="padding-left:90px;"><span style="color:#339966;">// Cria o arquivo teste.txt</span></p>
<p style="padding-left:90px;">PrintWriter pw = <span style="color:#993366;"><strong>new </strong></span>PrintWriter(file);</p>
<p style="padding-left:90px;"><span style="color:#339966;">// escreve no arquivo</span></p>
<p style="padding-left:90px;">pw.println(<span style="color:#3366ff;">&#8220;primeira frase PrintWriter&#8221;</span>);</p>
<p style="padding-left:90px;"><span style="color:#339966;">// escreve no arquivo</span></p>
<p style="padding-left:90px;">pw.println(<span style="color:#3366ff;">&#8220;segunda frase PrintWriter&#8221;</span>);</p>
<p style="padding-left:90px;"><span style="color:#339966;">// garante que a ultima parte (buffer) foi entregue ao arquivo</span></p>
<p style="padding-left:90px;">pw.flush();</p>
<p style="padding-left:90px;"><span style="color:#339966;">// libera recursos do S.O. utilizado</span></p>
<p style="padding-left:90px;">pw.close();</p>
<p style="padding-left:60px;">} <span style="color:#993366;"><strong>catch </strong></span>(IOException e) {</p>
<p style="padding-left:90px;">e.printStackTrace();</p>
<p style="padding-left:60px;">}</p>
<p style="padding-left:30px;">}</p>
<p style="padding-left:30px;"><span style="color:#993366;"><strong>private static void</strong></span> utilizandoWrapperBufferedReader(File file) {</p>
<p style="padding-left:60px;"><span style="color:#993366;"><strong>try </strong></span>{</p>
<p style="padding-left:90px;"><span style="color:#339966;">// obtem o arquivo teste-003.txt</span></p>
<p style="padding-left:90px;">FileReader fr = <span style="color:#993366;"><strong>new </strong></span>FileReader(file);</p>
<p style="padding-left:90px;"><span style="color:#339966;">// cria um buffer para obter os dados a partir do FileReader</span></p>
<p style="padding-left:90px;">BufferedReader br = <span style="color:#993366;"><strong>new </strong></span>BufferedReader(fr);</p>
<p style="padding-left:90px;">String linha;</p>
<p style="padding-left:90px;"><span style="color:#339966;">// enquanto houver uma linha com conteudo</span></p>
<p style="padding-left:90px;"><span style="color:#993366;"><strong>while </strong></span>((linha = br.readLine()) != <span style="color:#993366;"><strong>null</strong></span>) {</p>
<p style="padding-left:120px;">System.<span style="color:#3366ff;"><em>out</em></span>.println(linha);</p>
<p style="padding-left:90px;">}</p>
<p style="padding-left:90px;"><span style="color:#339966;">// libera recursos do S.O. utilizado</span></p>
<p style="padding-left:90px;">br.close();</p>
<p style="padding-left:60px;">} <span style="color:#993366;"><strong>catch </strong></span>(IOException e) {</p>
<p style="padding-left:90px;">e.printStackTrace();</p>
<p style="padding-left:60px;">}</p>
<p style="padding-left:30px;">}</p>
<p>&nbsp;</p>
<p><span style="font-size:large;"><strong>2. Manipulando Diretórios</strong></span></p>
<p>&nbsp;</p>
<p>Como criar, renomear e deletar um diretório&#8230;</p>
<p>&nbsp;</p>
<p style="padding-left:30px;"><span style="color:#993366;"><strong>public static void</strong></span> main(String[] args) {</p>
<p style="padding-left:60px;"><em>criandoUmDiretorioEAdicionandoUmArquivo</em>();</p>
<p style="padding-left:30px;">}</p>
<p style="padding-left:30px;"><span style="color:#993366;"><strong>private static void</strong></span> criandoUmDiretorioEAdicionandoUmArquivo(){</p>
<p style="padding-left:60px;"><span style="color:#993366;"><strong>try </strong></span>{</p>
<p style="padding-left:90px;">File diretorio = <span style="color:#993366;"><strong>new </strong></span>File(&#8220;novoDiretorio&#8221;);</p>
<p style="padding-left:90px;"><span style="color:#339966;">// cria o diretorio</span></p>
<p style="padding-left:90px;">diretorio.mkdir();</p>
<p style="padding-left:90px;"><span style="color:#339966;">// cria o arquivo no novoDiretorio</span></p>
<p style="padding-left:90px;">File novoArquivo = <span style="color:#993366;"><strong>new </strong></span>File(diretorio,<span style="color:#3366ff;"> &#8220;arquivoNovo.txt&#8221;</span>);</p>
<p style="padding-left:90px;">novoArquivo.createNewFile();</p>
<p style="padding-left:90px;"><span style="color:#339966;">// retorna false &#8211; nao eh possivel deletar um diretorio que nao esteja vazio</span></p>
<p style="padding-left:90px;">System.<span style="color:#3366ff;"><em>out</em></span>.println(diretorio.delete());</p>
<p style="padding-left:90px;"><span style="color:#339966;">// renomeando diretorio</span></p>
<p style="padding-left:90px;">diretorio.renameTo(<span style="color:#993366;"><strong>new </strong></span>File(<span style="color:#3366ff;">&#8220;diretorioRenomeado&#8221;</span>));</p>
<p style="padding-left:60px;">} <span style="color:#993366;"><strong>catch </strong></span>(IOException e) {</p>
<p style="padding-left:90px;">e.printStackTrace();</p>
<p style="padding-left:60px;">}</p>
<p style="padding-left:30px;">}</p>
<p><span style="font-size:medium;"><strong>Dicas</strong></span></p>
<p style="padding-left:30px;"><span style="font-size:medium;"><span style="font-size:small;"><strong>1.</strong> O construtor <strong>new File(&#8220;arquivo.txt&#8221;)</strong> não cria o arquivo no disco. Só será criado o arquivo ao invocar o método <strong>createNewFile().</strong></span></span></p>
<p style="padding-left:30px;"><span style="font-size:medium;"><span style="font-size:small;"><strong>2.</strong> O método <strong>renameTo()</strong> recebe um <strong>File</strong>.</span></span></p>
<p style="padding-left:30px;"><span style="font-size:medium;"><span style="font-size:small;"><strong>3.</strong> Apenas as classes <strong>File</strong>, <strong>FileWriter</strong> e <strong>PrintWriter</strong> recebem uma <strong>String</strong> no construtor.</span></span></p>
<p><span style="font-size:small;">É isso ai pessoal, nos próximos posts vamos ver um pouco mais sobre o pacote <strong>java.io</strong>.</span></p>
<p>&nbsp;</p>
<p><strong>É isso ai pessoal, compartilhem, comentem e estudem!</strong></p>
<p>&nbsp;</p>
<p><em>Escrito por Marcos Oto Picarelli Prado</em></p>
<p><span style="font-size:x-small;"><br /></span></p>
<img src="http://feeds.feedburner.com/~r/dextra-jblog/~4/ruzdMfhGA9M" height="1" width="1" alt=""/>]]></content:encoded>
      </item>
      <item>
         <title>[017] Strings, E/S Formatação e parsing</title>
         <link>http://feedproxy.google.com/~r/dextra-jblog/~3/DkyPsdKCvM0/</link>
         <description>&lt;p&gt;&lt;strong&gt;Bom dia pessoal,&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Hoje vamos falar um pouco sobre uma das classes mais utilizadas no nosso dia-dia, a classe String. E complementaremos com duas classes que são utilizadas para facilitar o uso das Strings.&lt;/p&gt;
&lt;p&gt;&amp;#160;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size:medium;&quot;&gt;&lt;strong&gt;Assuntos&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;String&lt;/li&gt;
&lt;li&gt;StringBuffer e StringBuilder&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&amp;#8230;&lt;/p&gt;</description>
         <guid isPermaLink="false">http://blogs.dextra.com.br/?p=526</guid>
         <pubDate>Sat, 24 Sep 2011 13:54:30 +0000</pubDate>
         <content:encoded><![CDATA[<p><strong>Bom dia pessoal,</strong></p>
<p>Hoje vamos falar um pouco sobre uma das classes mais utilizadas no nosso dia-dia, a classe String. E complementaremos com duas classes que são utilizadas para facilitar o uso das Strings.</p>
<p>&nbsp;</p>
<p><span style="font-size:medium;"><strong>Assuntos</strong></span></p>
<ul>
<li>String</li>
<li>StringBuffer e StringBuilder</li>
</ul>
<p>&nbsp;</p>
<p><span style="font-size:medium;"><strong>String</strong></span></p>
<p>O que precisamos saber de <strong>String</strong> para a certificação?</p>
<ol>
<li><strong>String</strong> é imutável, ou seja, uma vez atribuido um valor a uma <strong>String</strong> esse valor nunca poderá ser alterado.</li>
<li>Ao criar uma nova <strong>String</strong> a JVM verifica no pool de <strong>String</strong> se já existe alguma igual e então faz com que sua nova <strong>String</strong> (variável de referência) aponte para o Objeto (memória) existente.</li>
<li>Métodos:</li>
</ol>
<p style="padding-left:60px;"><strong>charAt()</strong>; Retorna o caracter localizado no índice específico.</p>
<p style="padding-left:60px;"><strong>concat()</strong>; Anexa uma String ao final de outra.</p>
<p style="padding-left:60px;"><strong>equalsIgnoreCase()</strong>; Determina a igualdade de duas Strings, ignorando maiúsculas com minúsculas.</p>
<p style="padding-left:60px;"><strong>lenght()</strong>; Retorna o número de caracteres de uma <strong>String</strong>.</p>
<p style="padding-left:60px;"><strong>replace()</strong>; Substitui as ocorrências de um caracter por um outro caracter.</p>
<p style="padding-left:60px;"><strong>substring()</strong>; Retorna uma parte de uma <strong>String</strong>.</p>
<p style="padding-left:60px;"><strong>toLowerCase()</strong>; Retorna uma <strong>String</strong> em letras minúsculas.</p>
<p style="padding-left:60px;"><strong>toString()</strong>; Retorna o valor de uma <strong>String</strong>.</p>
<p style="padding-left:60px;"><strong>toUpperCase()</strong>; Retorna uma <strong>String</strong> em letras maiúsculas.</p>
<p style="padding-left:60px;"><strong>trim()</strong>; Remove os espaços em branco no início e no fim de uma <strong>String</strong>.</p>
<p>&nbsp;</p>
<p><strong>Vejamos alguns exemplos:</strong></p>
<p style="padding-left:30px;"><strong>1. Métodos:</strong></p>
<p style="padding-left:30px;"><span style="color:#993366;"><strong>public static void</strong></span> main(String[] args) {</p>
<p style="padding-left:60px;">String s1 =<span style="color:#3366ff;"> &#8220;abcdef&#8221;</span>;</p>
<p style="padding-left:60px;">System.<span style="color:#3366ff;"><em>out</em></span>.println(s1);</p>
<p style="padding-left:60px;">&nbsp;</p>
<p style="padding-left:60px;"><span style="color:#993366;"><strong>char</strong></span> c = s1.charAt(3);</p>
<p style="padding-left:60px;">System.<span style="color:#3366ff;"><em>out</em></span>.println(c);</p>
<p style="padding-left:60px;">&nbsp;</p>
<p style="padding-left:60px;">s1 = s1.concat(<span style="color:#3366ff;">&#8220;ghij&#8221;</span>);</p>
<p style="padding-left:60px;">System.<span style="color:#3366ff;"><em>out</em></span>.println(s1);</p>
<p style="padding-left:60px;">&nbsp;</p>
<p style="padding-left:60px;"><strong><span style="color:#993366;">boolean</span></strong> equals = s1.equalsIgnoreCase(<span style="color:#3366ff;">&#8220;ABCDEFGHIJ&#8221;</span>);</p>
<p style="padding-left:60px;">System.<span style="color:#3366ff;"><em>out</em></span>.println(equals);</p>
<p style="padding-left:60px;">&nbsp;</p>
<p style="padding-left:60px;"><span style="color:#993366;"><strong>int</strong></span> length = s1.length();</p>
<p style="padding-left:60px;">System.<span style="color:#3366ff;"><em>out</em></span>.println(length);</p>
<p style="padding-left:60px;">&nbsp;</p>
<p style="padding-left:60px;">String s2 = <span style="color:#3366ff;">&#8220;XEGAX&#8221;</span>.replace(<span style="color:#3366ff;">&#8216;X&#8217;</span>, <span style="color:#3366ff;">&#8216;L&#8217;</span>);</p>
<p style="padding-left:60px;">System.<span style="color:#3366ff;"><em>out</em></span>.println(s2);</p>
<p style="padding-left:60px;">&nbsp;</p>
<p style="padding-left:60px;">System.<em><span style="color:#3366ff;">out</span></em>.println(s2.substring(2));</p>
<p style="padding-left:60px;">System.<span style="color:#3366ff;"><em>out</em></span>.println(s2.substring(2, 4));</p>
<p style="padding-left:60px;">&nbsp;</p>
<p style="padding-left:60px;">String s3 = <span style="color:#3366ff;">&#8220;Java InTerEssAnte!&#8221;</span>.toLowerCase();</p>
<p style="padding-left:60px;">System.<em><span style="color:#3366ff;">out</span></em>.println(s3);</p>
<p style="padding-left:60px;">&nbsp;</p>
<p style="padding-left:60px;">String s4 =<span style="color:#3366ff;"> &#8220;Java InTerEssAnte!&#8221;</span>.toUpperCase();</p>
<p style="padding-left:60px;">System.<span style="color:#3366ff;"><em>out</em></span>.println(s4);</p>
<p style="padding-left:60px;">&nbsp;</p>
<p style="padding-left:60px;">String s5 = <span style="color:#3366ff;">&#8221;  0123  456  &#8220;</span>.trim();</p>
<p style="padding-left:60px;">System.<span style="color:#3366ff;"><em>out</em></span>.println(s5);</p>
<p style="padding-left:30px;">}</p>
<p>&nbsp;</p>
<p style="padding-left:30px;"><strong>2. String e a criação de Objetos</strong></p>
<p style="padding-left:30px;"><span style="color:#993366;"><strong>public static void</strong></span> main(String[] args) {</p>
<p style="padding-left:60px;">String a = <span style="color:#3366ff;">&#8220;abcde&#8221;</span>; <span style="color:#339966;">// Cria 1º Objeto na memoria &#8220;abcde&#8221;</span></p>
<p style="padding-left:60px;">a.concat(<span style="color:#3366ff;">&#8220;fghij&#8221;</span>); <span style="color:#339966;">// Cria o 2º &#8220;fghij&#8221; e o 3º &#8220;abcdefghij&#8221; Objeto na memoria</span></p>
<p style="padding-left:60px;">String b = <span style="color:#3366ff;">&#8220;abcde&#8221;</span>; <span style="color:#339966;">// Nao cria um novo Objeto porque ja existe um Objeto &#8220;abcde&#8221; na memoria</span></p>
<p style="padding-left:30px;">}</p>
<p style="padding-left:30px;">&nbsp;</p>
<p style="padding-left:30px;"><strong>3. Dica sobre concatenação com Strings</strong></p>
<p style="padding-left:30px;"><span style="color:#993366;"><strong>public static void</strong></span> main(String[] args) {</p>
<p style="padding-left:60px;">String a =<span style="color:#3366ff;"> &#8220;abcde&#8221;</span>;</p>
<p style="padding-left:60px;">a = a + <span style="color:#3366ff;">&#8220;fghij&#8221;</span>; <span style="color:#339966;">// O operador + adiciona a string posterior a string anterior &#8220;abcdefghij&#8221;</span></p>
<p style="padding-left:60px;">a.concat(<span style="color:#3366ff;">&#8220;XX&#8221;</span>); <span style="color:#339966;">// Apenas a chamada ao metodo concat nao atribui o valor XX na variavel a</span></p>
<p style="padding-left:60px;">System.<span style="color:#3366ff;"><em>out</em></span>.println(a);</p>
<p style="padding-left:60px;">a += <span style="color:#3366ff;">&#8220;XX&#8221;</span>; <span style="color:#339966;">// Neste caso temos uma atribuicao, entao a variavel a recebera XX -&gt; &#8220;abcdefghijXX&#8221;</span></p>
<p style="padding-left:60px;"><span style="color:#339966;"><span style="color:#000000;">System.<span style="color:#3366ff;"><em>out</em></span>.println(a);</span><br /></span></p>
<p style="padding-left:30px;">}</p>
<p>&nbsp;</p>
<p><span style="font-size:medium;"><strong>StringBuffer e StringBuilder</strong></span></p>
<p>&nbsp;</p>
<p>O que precisamos saber de StringBuffer e StringBuilder para a certificação?</p>
<ol>
<li> São utilizadas para minimizar o pool de Strings caso você precise manipular várias de suas caracteres. Como vimos anteriormente cada String é um objeto em memória.</li>
<li>O <strong>StringBuffer</strong> pode ser manipulado repetidamente e não deixará Objetos Strings para trás.</li>
<li>A diferença:</li>
</ol>
<p style="padding-left:60px;">A classe <strong>StringBuffer</strong> tem seus métodos declarados como <span style="color:#993366;"><strong>synchronized</strong></span> e por isso são ótimos para trabalhar com <strong>Threads</strong>, já a classe <strong>StringBuilder</strong> não tem seus métodos sincronizados com isso tem a vantagem de que pode ser mais rápida (mas não use essa classe para sistemas com muitas threads).</p>
<p>&nbsp;</p>
<p>Iremos trabalhar mais com essas classes quando falaremos de <strong>Threads</strong>.</p>
<p>&nbsp;</p>
<p><strong>Veja um exemplo de StringBuffer</strong></p>
<p style="padding-left:30px;"><strong><span style="color:#993366;">public static void</span></strong> main(String[] args) {</p>
<p style="padding-left:60px;">StringBuffer s1 = <strong><span style="color:#993366;">new</span></strong> StringBuffer(<span style="color:#3366ff;">&#8220;abcde&#8221;</span>);</p>
<p style="padding-left:60px;">s1.append<span style="color:#3366ff;"><span style="color:#000000;">(</span>&#8220;fghij&#8221;</span>);</p>
<p style="padding-left:60px;">System.<span style="color:#3366ff;"><em>out</em></span>.println(s1);</p>
<p style="padding-left:60px;">&nbsp;</p>
<p style="padding-left:60px;">StringBuffer s2 = <span style="color:#993366;"><strong>new</strong></span> StringBuffer(<span style="color:#3366ff;">&#8220;abcde&#8221;</span>);</p>
<p style="padding-left:60px;">s2.reverse().append(<span style="color:#3366ff;">&#8220;fghij&#8221;</span>).insert(5, <span style="color:#3366ff;">&#8220;&lt;&gt;&#8221;</span>);</p>
<p style="padding-left:60px;">System.<em><span style="color:#3366ff;">out</span></em>.println(s2);</p>
<p style="padding-left:30px;">}</p>
<p style="padding-left:30px;">&nbsp;</p>
<p><strong>É isso ai pessoal, compartilhem, comentem e estudem!</strong></p>
<p>&nbsp;</p>
<p><em>Escrito por Marcos Oto Picarelli Prado</em></p>
<img src="http://feeds.feedburner.com/~r/dextra-jblog/~4/DkyPsdKCvM0" height="1" width="1" alt=""/>]]></content:encoded>
      </item>
      <item>
         <title>[Simulado/Respostas] Controle de fluxo, exceções e assertivas</title>
         <link>http://feedproxy.google.com/~r/dextra-jblog/~3/DGQn25kiMu0/</link>
         <description>&lt;div&gt;
&lt;div&gt;
&lt;p&gt;&lt;strong&gt;Bom dia pessoal,&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;vamos analisar as respostas do simulado aplicado no post anterior.&lt;/p&gt;
&lt;p&gt;&amp;#160;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1. As respostas corretas são:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&lt;strong&gt;C.&lt;/strong&gt; NumberFormatException&lt;strong&gt;&lt;br /&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&lt;strong&gt;D.&lt;/strong&gt; IllegalArgumentException&lt;/p&gt;
&lt;p&gt;O método parseInt lança um NumberFormatException quando não consergue converter a string para um número,&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&amp;#8230;&lt;/p&gt;</description>
         <guid isPermaLink="false">http://blogs.dextra.com.br/?p=530</guid>
         <pubDate>Tue, 20 Sep 2011 11:38:03 +0000</pubDate>
         <content:encoded><![CDATA[<div>
<div>
<p><strong>Bom dia pessoal,</strong></p>
<p>vamos analisar as respostas do simulado aplicado no post anterior.</p>
<p>&nbsp;</p>
<p><strong>1. As respostas corretas são:</strong></p>
<p><strong><strong>C.</strong> </strong>NumberFormatException<strong><br /></strong></p>
<p><strong><strong>D.</strong> </strong>IllegalArgumentException</p>
<p>O método parseInt lança um NumberFormatException quando não consergue converter a string para um número, e a resposta <strong>D </strong>também está correta porque NumberFormatException É-UM IllegalArgumentException.</p>
<p>&nbsp;</p>
<p><strong>2. As respostas corretas são:</strong></p>
<p><strong><strong>A. </strong><span style="color:#993366;">for</span></strong><span style="color:#993366;"><span style="color:#000000;"> (</span><strong>int</strong></span> y : x) {</p>
<p><strong>D. <span style="color:#993366;">for</span></strong> (<span style="color:#993366;"><strong>int</strong></span> y=0, z=0;  z&lt;x.<span style="color:#3366ff;">length</span>;  z++) { y = x[z];</p>
<p><strong>F. <span style="color:#993366;">int</span></strong> y = 0; <span style="color:#993366;"><strong>for</strong></span> (<span style="color:#993366;"><strong>int</strong></span> z=0; z&lt;z.<span style="color:#3366ff;">length</span>; z++) { y = x[z]</p>
<p><strong><br /></strong></p>
<p><strong>3. A resposta correta é:</strong></p>
<p><strong>B.</strong> Ocorre falha na compilação devido a um erro na linha 10.</p>
<p>Em sobrescrita as exceções podem ser <strong>mais específicas</strong> e não mais generalizadas.</p>
<p>&nbsp;</p>
<p><strong>5. A resposta correta é:</strong></p>
<p><strong>D.</strong> 1 1 3 3 9 9</p>
<p>&nbsp;</p>
<p><strong>5. A resposta correta é:</strong></p>
<p><strong>C.</strong> 0 1 1 1 2 3 3</p>
<p>&nbsp;</p>
<p><strong>6. A resposta correta é:</strong></p>
<p><strong>D.</strong> Ocorre falha de compilação na linha 8.</p>
<p>A condição &#8220;assert() :&#8221; espera um retorno.</p>
<p>&nbsp;</p>
<p><strong>É isso ai pessoal, compartilhem, comentem e estudem!</strong></p>
<p>&nbsp;</p>
<p><em>Escrito por Marcos Oto Picarelli Prado</em></p>
</div>
</div>
<img src="http://feeds.feedburner.com/~r/dextra-jblog/~4/DGQn25kiMu0" height="1" width="1" alt=""/>]]></content:encoded>
      </item>
      <item>
         <title>[Simulado] Controle de fluxo, exceções e assertivas</title>
         <link>http://feedproxy.google.com/~r/dextra-jblog/~3/U8mUgpuxsBE/</link>
         <description>&lt;p&gt;&lt;span style=&quot;font-size:large;&quot;&gt;&lt;strong&gt;Bom dia pessoal,&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Hoje nosso simulado é sobre Controle de fluxo, exceções e assertivas. Bons estudos!&lt;/p&gt;
&lt;p&gt;&amp;#160;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1. Dado o código a seguir:&lt;/strong&gt;&lt;/p&gt;
&lt;p style=&quot;padding-left:30px;&quot;&gt;&lt;span style=&quot;color:#993366;&quot;&gt;&lt;strong&gt;try&lt;/strong&gt;&lt;/span&gt; { &lt;span style=&quot;color:#993366;&quot;&gt;&lt;strong&gt;int&lt;/strong&gt;&lt;/span&gt; x = Integer.&lt;em&gt;parseInt&lt;/em&gt;(&lt;span style=&quot;color:#3366ff;&quot;&gt;&amp;#8220;dois&amp;#8221;&lt;/span&gt;); }&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Qual opção poderia ser usada para&lt;/strong&gt;&amp;#8230;&lt;/p&gt;</description>
         <guid isPermaLink="false">http://blogs.dextra.com.br/?p=493</guid>
         <pubDate>Thu, 15 Sep 2011 21:00:34 +0000</pubDate>
         <content:encoded><![CDATA[<p><span style="font-size:large;"><strong>Bom dia pessoal,</strong></span></p>
<p>Hoje nosso simulado é sobre Controle de fluxo, exceções e assertivas. Bons estudos!</p>
<p>&nbsp;</p>
<p><strong>1. Dado o código a seguir:</strong></p>
<p style="padding-left:30px;"><span style="color:#993366;"><strong>try</strong></span> { <span style="color:#993366;"><strong>int</strong></span> x = Integer.<em>parseInt</em>(<span style="color:#3366ff;">&#8220;dois&#8221;</span>); }</p>
<p><strong>Qual opção poderia ser usada para se criar um bloco catch apropriado? (marque todas as corretas)</strong></p>
<p style="padding-left:30px;">A. ClassCastException</p>
<p style="padding-left:30px;">B. IllegalStateException</p>
<p style="padding-left:30px;">C. NumberFormatException</p>
<p style="padding-left:30px;">D. IllegalArgumentException</p>
<p style="padding-left:30px;">E. ExceptionInInitializerError</p>
<p style="padding-left:30px;">F. ArrayIndexOutOfBoundException</p>
<p>&nbsp;</p>
<p><strong>2. Dado o código a seguir:</strong></p>
<p style="padding-left:30px;"><span style="color:#993366;"><strong>public class</strong></span> Loop {</p>
<p style="padding-left:60px;"><span style="color:#993366;"><strong>public static void</strong></span> main(String[] args) {</p>
<p style="padding-left:90px;"><span style="color:#993366;"><strong>int</strong></span>[] x = {7,6,4,3,2,1};</p>
<p style="padding-left:90px;"><span style="color:#339966;">// insira codigo aqui</span></p>
<p style="padding-left:120px;">System.<span style="color:#3366ff;"><em>out</em></span>.println();</p>
<p style="padding-left:90px;">}</p>
<p style="padding-left:60px;">}</p>
<p style="padding-left:30px;">}</p>
<p>&nbsp;</p>
<p><strong>Qual opção, inserida independentemente na  linha 4, compila? (marque todas as respostas corretas)</strong></p>
<p style="padding-left:30px;">A. <span style="color:#993366;"><strong>for </strong></span>(<span style="color:#993366;"><strong>int</strong></span> y : x) {</p>
<p style="padding-left:30px;">B. <span style="color:#993366;"><strong>for </strong></span>(x : <span style="color:#993366;"><strong>int</strong></span> y) {</p>
<p style="padding-left:30px;">C. <span style="color:#993366;"><strong>int</strong></span> y = 0; <span style="color:#993366;"><strong>for</strong></span>(y : x) {</p>
<p style="padding-left:30px;">D. <span style="color:#993366;"><strong>for </strong></span>(<span style="color:#993366;"><strong>int</strong></span> y=0, z=0;  z&lt;x.length;  z++) { y = x[z];</p>
<p style="padding-left:30px;">E. <span style="color:#993366;"><strong>for </strong></span>(<span style="color:#993366;"><strong>int</strong></span> y=0, <span style="color:#993366;"><strong>int</strong></span> z=0;  z&lt;x.length;  z++) { y = x[z];</p>
<p style="padding-left:30px;">F. <span style="color:#993366;"><strong>int</strong></span> y = 0; <span style="color:#993366;"><strong>for </strong></span>(<span style="color:#993366;"><strong>int</strong></span> z=0;  z&lt;x.length;  z++) { y = x[z];</p>
<p>&nbsp;</p>
<p><strong>3. Dado o código a seguir:</strong></p>
<p style="padding-left:30px;">3.<span style="color:#993366;"><strong> class</strong></span> SubException <span style="color:#993366;"><strong>extends</strong></span> Exception {}</p>
<p style="padding-left:30px;">4.  <span style="color:#993366;"><strong>class</strong></span> SubSubException <span style="color:#993366;"><strong>extends</strong></span> SubException {}</p>
<p style="padding-left:30px;">5.</p>
<p style="padding-left:30px;">6.  <span style="color:#993366;"><strong>public class </strong></span>Classe1 { <span style="color:#993366;"><strong>void</strong></span> fazAlgumaCoisa() <span style="color:#993366;"><strong>throws</strong></span> SubException {} }</p>
<p style="padding-left:30px;">7.</p>
<p style="padding-left:30px;">8.  <span style="color:#993366;"><strong>class</strong></span> Classe2 <span style="color:#993366;"><strong>extends</strong></span> Classe1 { <span style="color:#993366;"><strong>void</strong></span> fazAlgumaCoisa() <span style="color:#993366;"><strong>throws</strong></span> SubSubException {} }</p>
<p style="padding-left:30px;">9.</p>
<p style="padding-left:30px;">10. <span style="color:#993366;"><strong>class</strong></span> Classe3 <span style="color:#993366;"><strong>extends</strong></span> Classe1 { <span style="color:#993366;"><strong>void</strong></span> fazAlgumaCoisa() <span style="color:#993366;"><strong>throws</strong></span> Exception {} }</p>
<p style="padding-left:30px;">11.</p>
<p style="padding-left:30px;">12. <span style="color:#993366;"><strong>class</strong></span> Classe4 <span style="color:#993366;"><strong>extends</strong></span> Classe1 { <span style="color:#993366;"><strong>void</strong></span> fazAlgumaCoisa(int x) <span style="color:#993366;"><strong>throws</strong></span> Exception {} }</p>
<p style="padding-left:30px;">13.</p>
<p style="padding-left:30px;">14. <span style="color:#993366;"><strong>class</strong></span> Classe5 <span style="color:#993366;"><strong>extends</strong></span> Classe1 { <span style="color:#993366;"><strong>void</strong></span> fazAlgumaCoisa(){} }</p>
<p>&nbsp;</p>
<p><strong>Qual é o resultado? (marque todas as respostas corretas)</strong></p>
<p style="padding-left:30px;">A. A compilação é bem-sucedida.</p>
<p style="padding-left:30px;">B. Ocorre falha na compilação devido a um erro na linha 8.</p>
<p style="padding-left:30px;">C. Ocorre falha na compilação devido a um erro na linha 10.</p>
<p style="padding-left:30px;">D. Ocorre falha na compilação devido a um erro na linha 12.</p>
<p style="padding-left:30px;">E. Ocorre falha na compilação devido a um erro na linha 14.</p>
<p style="padding-left:30px;">&nbsp;</p>
<p><strong>4. Dado o código a seguir:</strong></p>
<p style="padding-left:30px;"><span style="color:#993366;"><strong>public class</strong></span> Loop {</p>
<p style="padding-left:60px;"><span style="color:#993366;"><strong>public static void</strong></span> main(String[] args) {</p>
<p style="padding-left:90px;"><span style="color:#993366;"><strong>int</strong></span> [] ia = {1,3,5,7,9};</p>
<p style="padding-left:90px;"><span style="color:#993366;"><strong>for</strong></span> (<span style="color:#993366;"><strong>int</strong></span> x : ia) {</p>
<p style="padding-left:120px;"><span style="color:#993366;"><strong>for </strong></span>(<span style="color:#993366;"><strong>int</strong></span> j = 0; j &lt; 3; j++){</p>
<p style="padding-left:150px;"><span style="color:#993366;"><strong>if </strong></span>(x &gt; 4 &amp;&amp; x &lt; 8 <span style="color:#339966;">/**/</span>) <span style="color:#993366;"><strong>continue</strong></span>;</p>
<p style="padding-left:150px;">System.<span style="color:#3366ff;"><em>out</em></span>.print(<span style="color:#3366ff;">&#8221; &#8220;</span> + x);</p>
<p style="padding-left:150px;"><span style="color:#993366;"><strong>if </strong></span>(j == 1) <span style="color:#993366;"><strong>break</strong></span>;</p>
<p style="padding-left:150px;"><span style="color:#993366;"><strong>continue</strong></span>;</p>
<p style="padding-left:120px;">}</p>
<p style="padding-left:120px;"><span style="color:#993366;"><strong>continue</strong></span>;</p>
<p style="padding-left:90px;">}</p>
<p style="padding-left:60px;">}</p>
<p style="padding-left:30px;">}</p>
<p>&nbsp;</p>
<p><strong>Qual é o resultado?</strong></p>
<p style="padding-left:30px;">A. 1 3 9</p>
<p style="padding-left:30px;">B. 5 5 7 7</p>
<p style="padding-left:30px;">C. 1 3 3 9 9</p>
<p style="padding-left:30px;">D. 1 1 3 3 9 9</p>
<p style="padding-left:30px;">E. 1 1 1 3 3 3 9 9 9</p>
<p style="padding-left:30px;">F. Ocorre falha na compilação</p>
<p>&nbsp;</p>
<p><strong>5. Dado o código a seguir:</strong></p>
<p style="padding-left:30px;"><span style="color:#993366;"><strong>public class</strong></span> Loop {</p>
<p style="padding-left:60px;"><span style="color:#993366;"><strong>public static void</strong></span> main(String[] args) {</p>
<p style="padding-left:90px;">foreach : <span style="color:#993366;"><strong>for </strong></span>(<span style="color:#993366;"><strong>int</strong></span> j=0; j&lt;5; j++) {</p>
<p style="padding-left:120px;"><span style="color:#993366;"><strong>for </strong></span>(<span style="color:#993366;"><strong>int</strong></span> k=0; k&lt;3; k++) {</p>
<p style="padding-left:150px;">System.<span style="color:#3366ff;"><em>out</em></span>.print(&#8221; &#8221; + j);</p>
<p style="padding-left:150px;"><span style="color:#993366;"><strong>if </strong></span>(j==3 &amp;&amp; k==1) <span style="color:#993366;"><strong>break</strong></span> foreach;</p>
<p style="padding-left:150px;"><span style="color:#993366;"><strong>if </strong></span>(j==0 || j==2) <span style="color:#993366;"><strong>break</strong></span>;</p>
<p style="padding-left:120px;">}</p>
<p style="padding-left:90px;">}</p>
<p style="padding-left:60px;">}</p>
<p style="padding-left:30px;">}</p>
<p>&nbsp;</p>
<p><strong>Qual é o resultado?</strong></p>
<p style="padding-left:30px;">A. 0 1 2 3</p>
<p style="padding-left:30px;">B. 1 1 1 3 3</p>
<p style="padding-left:30px;">C. 0 1 1 1 2 3 3</p>
<p style="padding-left:30px;">D. 1 1 1 3 3 4 4 4</p>
<p style="padding-left:30px;">E. 0 1 1 1 2 3 3 4 4 4</p>
<p style="padding-left:30px;">F. Ocorre falha na compilação</p>
<p style="padding-left:30px;">&nbsp;</p>
<p><strong>6. Dado o código a seguir:</strong></p>
<p style="padding-left:30px;"><span style="color:#993366;"><strong>public class</strong></span> ManipulandoAssertivas {</p>
<p style="padding-left:60px;"><span style="color:#993366;"><strong>public static void</strong></span> main(String[] args) {</p>
<p style="padding-left:90px;"><span style="color:#993366;"><strong>int</strong></span> var = 1;</p>
<p style="padding-left:90px;"><span style="color:#993366;"><strong>assert</strong></span> (++var &gt; 1); <span style="color:#339966;">// linha 4</span></p>
<p style="padding-left:90px;"><span style="color:#993366;"><strong>assert</strong></span> (var++ &gt; 2) : <span style="color:#3366ff;">&#8220;algo&#8221;</span>; <span style="color:#339966;">// linha 5</span></p>
<p style="padding-left:90px;"><span style="color:#993366;"><strong>assert</strong></span> (var &gt; 4) : var = 12; <span style="color:#339966;">// linha 6</span></p>
<p style="padding-left:90px;"><span style="color:#993366;"><strong>assert</strong></span> (var == 6) : <em>fazAlgumaCoisaComRetorno()</em>; <span style="color:#339966;">// linha 7</span></p>
<p style="padding-left:90px;"><span style="color:#993366;"><strong>assert</strong></span> (var == 6) : <em>fazAlgumaCoisaSemRetorno()</em>; <span style="color:#339966;">// linha 8</span></p>
<p style="padding-left:90px;"><span style="color:#993366;"><strong>assert</strong></span> (var == 6) : <span style="color:#993366;"><strong>new</strong></span> ManipulandoAssertivas(); <span style="color:#339966;">// linha 9</span></p>
<p style="padding-left:60px;">}</p>
<p style="padding-left:60px;"><span style="color:#993366;"><strong>static void</strong></span> fazAlgumaCoisaSemRetorno() { }</p>
<p style="padding-left:60px;"><span style="color:#993366;"><strong>static</strong></span> String fazAlgumaCoisaComRetorno() { <span style="color:#993366;"><strong>return</strong></span> <span style="color:#3366ff;">&#8220;XX&#8221;</span>; }</p>
<p style="padding-left:30px;">}</p>
<p><strong>Qual é o resultado?</strong></p>
<p style="padding-left:30px;">A. Ocorre múltiplas falhas de compilação.</p>
<p style="padding-left:30px;">B. Ocorre falha de compilação na linha 4.</p>
<p style="padding-left:30px;">C. Ocorre falha de compilação na linha 7.</p>
<p style="padding-left:30px;">D. Ocorre falha de compilação na linha 8.</p>
<p style="padding-left:30px;">E. Ocorre falha de compilação na linha 9.</p>
<p style="padding-left:30px;">F. O código compila com sucesso.</p>
<img src="http://feeds.feedburner.com/~r/dextra-jblog/~4/U8mUgpuxsBE" height="1" width="1" alt=""/>]]></content:encoded>
      </item>
      <item>
         <title>[016] Controle de fluxo, exceções e assertivas</title>
         <link>http://feedproxy.google.com/~r/dextra-jblog/~3/kY5_2-z-r5M/</link>
         <description>&lt;p&gt;&lt;span style=&quot;font-size:large;&quot;&gt;&lt;strong&gt;Bom dia pessoal,&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Hoje vamos falar um pouco sobre &lt;strong&gt;assertivas&lt;/strong&gt;, um assunto que irá ter poucas questões na prova e que podem ajudar na pontuação.&lt;/p&gt;
&lt;p&gt;&amp;#160;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size:medium;&quot;&gt;&lt;strong&gt;Assuntos&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Assertivas&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;#160;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size:medium;&quot;&gt;&lt;strong&gt;Assertivas&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;padding-left:30px;&quot;&gt;As &lt;strong&gt;assertivas&lt;/strong&gt; são utilizadas para &lt;strong&gt;minimizar&lt;/strong&gt;&amp;#8230;&lt;/p&gt;</description>
         <guid isPermaLink="false">http://blogs.dextra.com.br/?p=476</guid>
         <pubDate>Fri, 19 Aug 2011 11:30:35 +0000</pubDate>
         <content:encoded><![CDATA[<p><span style="font-size:large;"><strong>Bom dia pessoal,</strong></span></p>
<p>Hoje vamos falar um pouco sobre <strong>assertivas</strong>, um assunto que irá ter poucas questões na prova e que podem ajudar na pontuação.</p>
<p>&nbsp;</p>
<p><span style="font-size:medium;"><strong>Assuntos</strong></span></p>
<ul>
<li>Assertivas</li>
</ul>
<p>&nbsp;</p>
<p><span style="font-size:medium;"><strong>Assertivas</strong></span></p>
<p style="padding-left:30px;">As <strong>assertivas</strong> são utilizadas para <strong>minimizar</strong> a quantidade de <strong>manipuladores</strong> de exceções que <strong>nunca vão ocorrer</strong>. Vamos ver um exemplo para entender melhor.</p>
<p style="padding-left:60px;"><span style="color:#993366;"><strong>if</strong></span> (num &gt;= 0) {</p>
<p style="padding-left:90px;"><span style="color:#339966;">// faz alguma coisa</span></p>
<p style="padding-left:60px;">} <span style="color:#993366;"><strong>else</strong></span> {</p>
<p style="padding-left:90px;">System.<span style="color:#3366ff;"><em>out</em></span>.print(<span style="color:#3366ff;">“Numero negativo: ”</span> + num);</p>
<p style="padding-left:60px;">}</p>
<p style="padding-left:30px;">Já que você está tão certo que a variável <strong>num</strong> sempre será positiva então <strong>minimize</strong> seu código:</p>
<p style="padding-left:60px;"><span style="color:#993366;"><strong>assert</strong></span>(num &gt;= 0);</p>
<p style="padding-left:60px;"><span style="color:#339966;">// faz alguma coisa</span></p>
<p style="padding-left:30px;"><strong>Sempre</strong> assuma que a condição (<strong>num &gt;= 0</strong>) será <strong>verdadeira</strong>, caso contrário será lançada um <strong>AssertionError</strong>, e como vimos anteriormente, não podemos manipular um <strong>Error</strong>.</p>
<p>&nbsp;</p>
<p><strong>Existem duas formas de declarar as assertivas</strong></p>
<p style="padding-left:30px;"><strong>1.</strong> <span style="color:#993366;"><strong>assert</strong></span>(num  &gt;= 0);</p>
<p style="padding-left:30px;"><strong>2. </strong><span style="color:#993366;"><strong>assert</strong></span>(num   &gt;= 0) : <span style="color:#3366ff;">&#8220;O valor de num eh: &#8220;</span> + num;</p>
<p>&nbsp;</p>
<p><strong>Como usar? É preciso ativar?<br /></strong></p>
<p style="padding-left:30px;">As assertivas foram adicionadas na versão 1.4 do Java, e para utilizarmos em tempo de execução é necessário ativar. Veja como:</p>
<p style="padding-left:60px;">java <strong>–ea</strong> br.com.certificacao.Teste ou java <strong>–enableassertions</strong> br.com.certificacao.Teste</p>
<p style="padding-left:30px;">e se desejar desativar (já é desativado por padrão):</p>
<p style="padding-left:60px;">java <strong>-da</strong> br.com.certificacao.Teste ou java <strong>-disableassertions</strong> br.com.certificacao.Teste</p>
<p><strong>Vamos fazer um teste:</strong></p>
<p style="padding-left:30px;"><strong>1.</strong> Crie uma classe MinhaClasseTeste.java no seu diretório home.</p>
<p style="padding-left:60px;"><span style="color:#993366;"><strong>public class</strong></span> MinhaClasseTeste {</p>
<p style="padding-left:90px;"><strong><span style="color:#993366;">public static void</span></strong> main(String[] args) {</p>
<p style="padding-left:120px;"><span style="color:#993366;"><strong>int</strong></span> num = -3;</p>
<p style="padding-left:120px;"><span style="color:#993366;"><strong>assert</strong></span>(num &gt; 0) : <span style="color:#3366ff;">&#8220;A variavel num eh: &#8220;</span> + num;</p>
<p style="padding-left:120px;">System.out.println(<span style="color:#3366ff;">&#8220;Ok&#8221;</span>);</p>
<p style="padding-left:90px;">}</p>
<p style="padding-left:60px;">}</p>
<p style="padding-left:30px;"><strong>2.</strong> Compile: javac MinhaClasseTeste.java</p>
<p style="padding-left:30px;"><strong>3.</strong> Execute: java -ea MinhaClasseTeste</p>
<p style="padding-left:60px;">Resultado: Exception in thread &#8220;main&#8221; java.lang.AssertionError: A variavel num eh: -3</p>
<p style="padding-left:30px;"><strong>4.</strong> Execute: java -da MinhaClasseTeste</p>
<p style="padding-left:60px;">Resultado: Ok</p>
<p>&nbsp;</p>
<p><strong>E se depararmos com um código antigo que tinha um atributo chamado assert?</strong></p>
<p style="padding-left:30px;">Será necessário compilar a classe usando o seguinte comando:</p>
<p style="padding-left:60px;">java <strong>–source 1.3</strong> br.com.certificacao.Teste</p>
<p>&nbsp;</p>
<p><strong>E se executarmos uma classe com assert, mas utilizando o parâmetro padrão –da?</strong></p>
<p style="padding-left:30px;">A JVM simplesmente irá ignorar o comando assert.</p>
<p>&nbsp;</p>
<p><strong>Quando devemos usar? (apenas sugestão)</strong></p>
<ul>
<li>Devemos usar em testes para nos pouparmos de manipular exceções.</li>
<li>Em método privados.</li>
</ul>
<p>&nbsp;</p>
<p><strong>Quando não devemos usar? (apenas sugestão)</strong></p>
<ul>
<li>Em métodos públicos.</li>
<li>Em casos que afetam outros atributos:</li>
</ul>
<p style="padding-left:60px;"><span style="color:#993366;"><strong>assert</strong></span>(chamaMetodo());</p>
<p style="padding-left:60px;"><strong><span style="color:#993366;">public boolean</span></strong> chamaMetodo() {</p>
<p style="padding-left:90px;">usuario.ativar(); <span style="color:#339966;">// altera atributo.</span></p>
<p style="padding-left:90px;"><span style="color:#993366;"><strong>return true</strong></span>;</p>
<p style="padding-left:60px;">}</p>
<p>&nbsp;</p>
<p><strong>É isso ai pessoal, compartilhem, comentem e estudem!</strong></p>
<p>&nbsp;</p>
<p><em>Escrito por Marcos Oto Picarelli Prado</em></p>
<img src="http://feeds.feedburner.com/~r/dextra-jblog/~4/kY5_2-z-r5M" height="1" width="1" alt=""/>]]></content:encoded>
      </item>
      <item>
         <title>Computação na Nuvem: está na hora de adotar?</title>
         <link>http://feedproxy.google.com/~r/dextra-corporativo/~3/FE0hOfQ8tiY/</link>
         <description>&lt;p style=&quot;text-align:justify;&quot;&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://blogs.dextra.com.br/wp-content/uploads/2011/07/Gartner_Hype_Cycle.png&quot;&gt;&lt;br /&gt;&lt;/a&gt;Nos últimos anos, temos ouvido falar muito em Cloud Computing. Os níveis de “hype” em torno da tecnologia chegam a ser ensurdecedores. Temos a impressão de que, para todo lado que olhamos, alguém está falando de Nuvem. Todos&amp;#8230;&lt;/p&gt;</description>
         <guid isPermaLink="false">http://blogs.dextra.com.br/?p=438</guid>
         <pubDate>Thu, 04 Aug 2011 17:48:37 +0000</pubDate>
         <content:encoded/>
      </item>
      <item>
         <title>[015] Controle de fluxo, exceções e assertivas</title>
         <link>http://feedproxy.google.com/~r/dextra-jblog/~3/x5Rz0lXdu58/</link>
         <description>&lt;p&gt;&lt;span style=&quot;font-size:large;&quot;&gt;&lt;strong&gt;Bom dia pessoal,&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Hoje vamos falar sobre um assunto bem interessante que é &lt;strong&gt;exceções&lt;/strong&gt;&lt;strong&gt;.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&amp;#160;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size:medium;&quot;&gt;&lt;strong&gt;Assuntos&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Exceções&lt;/li&gt;
&lt;li&gt;Exceções e herança&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&amp;#160;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size:medium;&quot;&gt;&lt;strong&gt;1. Exceções&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;As &lt;strong&gt;exceções&lt;/strong&gt; são representadas pela classe &lt;strong&gt;Throwable&lt;/strong&gt;. Veja a hierarquia:&lt;/p&gt;
&lt;p style=&quot;padding-left:30px;&quot;&gt;&lt;strong&gt;Object&lt;/strong&gt;&lt;/p&gt;
&lt;p style=&quot;padding-left:60px;&quot;&gt;&amp;#124;&amp;#8230;&lt;/p&gt;</description>
         <guid isPermaLink="false">http://blogs.dextra.com.br/?p=449</guid>
         <pubDate>Wed, 03 Aug 2011 17:05:33 +0000</pubDate>
         <content:encoded><![CDATA[<p><span style="font-size:large;"><strong>Bom dia pessoal,</strong></span></p>
<p>Hoje vamos falar sobre um assunto bem interessante que é <strong>exceções</strong><strong>.</strong></p>
<p>&nbsp;</p>
<p><span style="font-size:medium;"><strong>Assuntos</strong></span></p>
<ol>
<li>Exceções</li>
<li>Exceções e herança</li>
</ol>
<p>&nbsp;</p>
<p><span style="font-size:medium;"><strong>1. Exceções</strong></span></p>
<p>As <strong>exceções</strong> são representadas pela classe <strong>Throwable</strong>. Veja a hierarquia:</p>
<p style="padding-left:30px;"><strong>Object</strong></p>
<p style="padding-left:60px;">|</p>
<p style="padding-left:60px;">`- <strong>Throwable</strong></p>
<p style="padding-left:90px;">|</p>
<p style="padding-left:90px;">`- <strong>Exception</strong></p>
<p style="padding-left:90px;">|      |</p>
<p style="padding-left:90px;">|      `- <strong>RuntimeException</strong></p>
<p style="padding-left:90px;">|</p>
<p style="padding-left:90px;">`- <strong>Error</strong></p>
<p>&nbsp;</p>
<p><span style="font-size:medium;"><strong>O que é cada uma delas?</strong></span></p>
<p>&nbsp;</p>
<ul>
<li><strong>Throwable</strong> – O pai de todos os santos.</li>
<li><strong>Error</strong> – Representa <strong>situações incomuns</strong> que não são causadas por erros no programa. <strong>Ex:</strong> OutOfMemoryError.java (Quando a JVM fica sem espaço de memória).</li>
<li><strong>Exception</strong> – São <strong>exceções</strong> que podem ser <strong>capturadas e tratadas</strong> (<strong>try</strong>/<strong>catch</strong>).</li>
<li><strong>RuntimeException</strong> – São <strong>exceções</strong> não esperadas que ocorrem em <strong>tempo de execução</strong> como por exemplo ArithmeticExcetion.java (divisão por zero).</li>
</ul>
<p>&nbsp;</p>
<p><span style="font-size:medium;"><strong>Regras básicas</strong></span></p>
<ol>
<li>Todas as <strong>exceções</strong> podem ser tratadas (<strong>try</strong>/<strong>cath</strong>), mas as que herdam de <strong>Error</strong> talvez não sejam possíveis tratar.</li>
<li>Se o método <strong>não lançar</strong> exceção (<strong>throws</strong>) <strong>não será</strong> possível tratar (<strong>try</strong>/<strong>catch</strong>) <strong>a não ser</strong> que o <strong>catch</strong> seja <strong>Exception</strong>.</li>
<li>É possível criar blocos <strong>try</strong>/<strong>catch</strong> e <strong>try</strong>/<strong>finally</strong> (sem necessidade).</li>
<li>O bloco <strong>finally</strong> não é obrigatório.</li>
<li>Se declarado o bloco <strong>finally</strong>, sempre será executado após o <strong>try</strong> ou o <strong>catch</strong>.</li>
<li>Os blocos <strong>catch</strong> serão analisados na ordem em que forem declarados.</li>
</ol>
<p>&nbsp;</p>
<p><span style="font-size:medium;"><strong>Exceções mais conhecidas</strong></span></p>
<ul>
<li><strong>ArrayIndexOutOfBounException</strong> - Lançada ao se tentar acessar um array com um valor de índice inválido (ou negativo ou maior do que o tamanho do array).</li>
<li><strong>ClassCastException</strong> - Lançada ao se tentar converter uma variável de referência em um tipo que não passa no teste <strong>É-UM</strong>.</li>
<li><strong>IllegalArgumentException</strong> - Lançada quando um método recebe um argumento formatado de forma diferente do que espera.</li>
<li><strong>IllegalStateException</strong> &#8211; Lançada quando um método é invocado em um momento ilegal ou impróprio. Em outras palavras, a aplicação Java não está em um estado apropriado para a operação solicitada.</li>
<li><strong>NullPointerException</strong> - Lançada ao se tentar acessar um objeto com uma variável de referência cujo atual seja <strong>null</strong>.</li>
<li><strong>NumberFormatException</strong> - Lançada quando um método que converte uma String em um número recebe uma String que não representa um número.</li>
<li><strong>AssertionError</strong> - Lançada quando um método <strong>boolean</strong> de uma instrução retorna <strong>false</strong>. Ex: <strong>assert. </strong>Veremos mais para frente.</li>
<li><strong>ExceptionInInitializerError</strong> - Lançada ao se tentar inicializar uma variável estática a um bloco de inicialização.</li>
<li><strong>StackOverflowError</strong> - Normalmente lançada quando um método faz recursões profundas demais.</li>
</ul>
<p>&nbsp;</p>
<p><span style="font-size:medium;"><strong>Vejamos alguns exemplos:</strong></span></p>
<p>&nbsp;</p>
<p style="padding-left:30px;"><span style="color:#993366;"><strong>public class</strong></span> ManipulandoError {</p>
<p style="padding-left:60px;"><span style="color:#993366;"><strong>public static</strong> <strong>void</strong></span> main(String[] args) {</p>
<p style="padding-left:90px;">ManipulandoError m = <span style="color:#993366;"><strong>new</strong></span> ManipulandoError(); m.metodoA();</p>
<p style="padding-left:60px;">}</p>
<p style="padding-left:60px;"><span style="color:#993366;"><strong>void</strong></span> metodoA() <span style="color:#993366;"><strong>throws</strong></span> Error { <span style="color:#993366;"><strong>throw</strong> <strong>new</strong></span> Error(); }</p>
<p style="padding-left:60px;"><span style="color:#993366;"><strong>void</strong></span> metodoB() {</p>
<p style="padding-left:90px;"><span style="color:#993366;"><strong>try</strong></span> {</p>
<p style="padding-left:120px;">metodoA();</p>
<p style="padding-left:90px;">} <span style="color:#993366;"><strong>catch</strong></span> (Error e) {</p>
<p style="padding-left:120px;">System.<span style="color:#3366ff;"><em>out</em></span>.println(<span style="color:#3366ff;">&#8220;erro&#8221;</span>);</p>
<p style="padding-left:90px;">}</p>
<p style="padding-left:60px;">}</p>
<p style="padding-left:30px;">}</p>
<p style="padding-left:30px;"><strong>Console:</strong></p>
<p style="padding-left:60px;">Exception in thread &#8220;main&#8221; java.lang.Error</p>
<p>Se você esperava imprimir<span style="color:#3366ff;"> “erro”</span> no console se enganou, porque a JVM viu que era um Error e então lançou o erro.</p>
<p>&nbsp;</p>
<p style="padding-left:30px;"><span style="color:#993366;"><strong>public class</strong></span> ManipulandoTryCatch {</p>
<p style="padding-left:60px;"><span style="color:#993366;"><strong>public static</strong> <strong>void</strong></span> main(String[] args) {</p>
<p style="padding-left:90px;">ManipulandoTryCatch m = <span style="color:#993366;"><strong>new</strong></span> ManipulandoTryCatch();</p>
<p style="padding-left:90px;">m.metodoA();</p>
<p style="padding-left:90px;">m.metodoC();</p>
<p style="padding-left:60px;">}</p>
<p style="padding-left:60px;"><span style="color:#993366;"><strong>void</strong></span> metodoA() {</p>
<p style="padding-left:90px;"><span style="color:#993366;"><strong>try</strong></span> { metodoB();</p>
<p style="padding-left:90px;">} <span style="color:#993366;"><strong>finally</strong></span> { System.out.println(<span style="color:#3366ff;">&#8220;Incrivel o que Java permite! (try/finally)&#8221;</span>); }</p>
<p style="padding-left:90px;"><span style="color:#993366;"><strong>try</strong></span> { metodoB();</p>
<p style="padding-left:90px;">} <span style="color:#993366;"><strong>catch</strong></span> (Exception e) { System.<span style="color:#3366ff;"><em>out</em></span>.println(<span style="color:#3366ff;">&#8220;Incrivel o que Java permite! (try/catch)&#8221;</span>); }</p>
<p style="padding-left:90px;"><span style="color:#993366;"><strong>try</strong></span> { metodoB();</p>
<p style="padding-left:90px;">} <span style="color:#993366;"><strong>catch</strong></span> (MinhaExcecao e) { } <span style="color:#339966;">// Aqui NAO COMPILA mesmo sabendo que MinhaExcecao E-UMA Exception</span></p>
<p style="padding-left:60px;">}</p>
<p style="padding-left:60px;"><span style="color:#993366;"><strong>void</strong></span> metodoB() { }</p>
<p style="padding-left:60px;"><span style="color:#993366;"><strong>void</strong></span> metodoC() {</p>
<p style="padding-left:90px;"><span style="color:#993366;"><strong>try</strong></span> { metodoD(); System.<em><span style="color:#3366ff;">out</span></em>.println(<span style="color:#3366ff;">&#8220;try&#8221;</span>);</p>
<p style="padding-left:90px;">} <span style="color:#993366;"><strong>catch</strong></span> (MinhaExcecao e) { System.<span style="color:#3366ff;"><em>out</em></span>.println(<span style="color:#3366ff;">&#8220;catch&#8221;</span>);</p>
<p style="padding-left:90px;">} <span style="color:#993366;"><strong>finally</strong></span> { System.<span style="color:#3366ff;"><em>out</em></span>.println(<span style="color:#3366ff;">&#8220;finally&#8221;</span>); } <span style="color:#339966;">// Sempre será executado o bloco finally</span></p>
<p style="padding-left:60px;">}</p>
<p style="padding-left:60px;"><span style="color:#993366;"><strong>void</strong></span> metodoD() <span style="color:#993366;"><strong>throws</strong></span> MinhaExcecao { <span style="color:#993366;"><strong>throw new</strong></span> MinhaExcecao(); }</p>
<p style="padding-left:120px;">&nbsp;</p>
<p style="padding-left:30px;">}</p>
<p style="padding-left:30px;"><span style="color:#993366;"><strong>class</strong></span> MinhaExcecao <span style="color:#993366;"><strong>extends</strong></span> Exception { <span style="color:#993366;"><strong>private static final long</strong></span> <span style="color:#3366ff;"><em>serialVersionUID</em></span> = 1L; }</p>
<p>&nbsp;</p>
<p><span style="font-size:medium;"><strong>2. Exceções e herança</strong></span></p>
<p>&nbsp;</p>
<p><span style="font-size:medium;"><strong><strong>Regras básicas</strong><br /></strong></span></p>
<ol>
<li><span style="font-size:small;">Entre os blocos <strong>catch</strong>, as mais específicas devem ser declaradas primeiro.</span></li>
<li><span style="font-size:small;">Quando uma <strong>exceção</strong> for herdada por <strong>RuntimeException</strong> não será necessário tratar (<strong>try</strong>/<strong>catch</strong>).</span></li>
</ol>
<p>&nbsp;</p>
<p><span style="font-size:medium;"><strong>Vejamos alguns exemplos:</strong></span></p>
<p>&nbsp;</p>
<p style="padding-left:30px;"><span style="color:#993366;"><strong>public class</strong></span> ManipulandoHeranca {</p>
<p style="padding-left:60px;"><span style="color:#993366;"><strong>private class</strong></span> PaiException <span style="color:#993366;"><strong>extends</strong></span> Exception {}</p>
<p style="padding-left:60px;"><span style="color:#993366;"><strong>private class</strong></span> FilhoDeSangueException <span style="color:#993366;"><strong>extends</strong></span> PaiException {}</p>
<p style="padding-left:60px;"><span style="color:#993366;"><strong>private class</strong></span> FilhoAdotadoException <span style="color:#993366;"><strong>extends</strong></span> PaiException {}</p>
<p style="padding-left:60px;"><span style="color:#993366;"><strong>public static void</strong></span> main(String[] args) {</p>
<p style="padding-left:90px;"><span style="color:#993366;"><strong>new</strong></span> ManipulandoHeranca().metodoA();</p>
<p style="padding-left:60px;">}</p>
<p style="padding-left:60px;"><span style="color:#993366;"><strong>void</strong></span> metodoA(){</p>
<p style="padding-left:90px;"><span style="color:#993366;"><strong>try</strong></span> { motodoB();</p>
<p style="padding-left:90px;">} <span style="color:#993366;"><strong>catch</strong></span> (FilhoDeSangueException e) { System.<span style="color:#3366ff;"><em>out</em></span>.println(<span style="color:#3366ff;">&#8220;filho de sangue&#8221;</span>);</p>
<p style="padding-left:90px;">} <span style="color:#993366;"><strong>catch</strong></span> (FilhoAdotadoException e) { System.<em><span style="color:#3366ff;">out</span></em>.println(<span style="color:#3366ff;">&#8220;filho adotado&#8221;</span>);</p>
<p style="padding-left:90px;">} <span style="color:#993366;"><strong>catch</strong></span> (PaiException e) { System.<em><span style="color:#3366ff;">out</span></em>.println(<span style="color:#3366ff;">&#8220;pai&#8221;</span>);</p>
<p style="padding-left:90px;">}</p>
<p style="padding-left:60px;">}</p>
<p style="padding-left:60px;"><span style="color:#993366;"><strong>private void</strong></span> motodoB() <span style="color:#993366;"><strong>throws</strong></span> PaiException { <span style="color:#993366;"><strong>throw new</strong></span> FilhoDeSangueException(); }</p>
<p style="padding-left:30px;">}</p>
<ul>
<li>No exemplo acima, se substituirmos o <strong>throws</strong> PaiException por <strong>throws</strong> FilhoDeSangueException o código não irá compilar, porque nunca poderá ser executada.</li>
<li>Também no exemplo acima, se colocássemos <strong>catch</strong> (PaiException e) em primeiro lugar, não compilaria porque como vimos acima deve ser declarado primeiro as exceções específicas.</li>
</ul>
<p>&nbsp;</p>
<p><strong>É isso ai pessoal, compartilhem, comentem e estudem!</strong></p>
<p>&nbsp;</p>
<p><em>Escrito por Marcos Oto Picarelli Prado</em></p>
<p><span style="font-size:medium;"><strong><br /></strong></span></p>
<img src="http://feeds.feedburner.com/~r/dextra-jblog/~4/x5Rz0lXdu58" height="1" width="1" alt=""/>]]></content:encoded>
      </item>
      <item>
         <title>[014] Controle de fluxo, exceções e assertivas</title>
         <link>http://feedproxy.google.com/~r/dextra-jblog/~3/NSHuO3-CF2A/</link>
         <description>&lt;p&gt;&lt;span style=&quot;font-size:large;&quot;&gt;&lt;strong&gt;Bom dia Pessoal,&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Hoje iremos ver dois assuntos bem utilizados no nosso dia-a-dia de programação. E para entendermos melhor iremos ver alguns exemplos.&lt;/p&gt;
&lt;p&gt;&amp;#160;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size:medium;&quot;&gt;&lt;strong&gt;Assuntos&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Instrução &lt;strong&gt;switch&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Conceitos básicos e importantes sobre &lt;strong&gt;loops&lt;/strong&gt; e &lt;strong&gt;iteradores&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;#160;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size:medium;&quot;&gt;&lt;strong&gt;Instrução switch&lt;/strong&gt;&lt;/span&gt;&amp;#8230;&lt;/p&gt;</description>
         <guid isPermaLink="false">http://blogs.dextra.com.br/?p=429</guid>
         <pubDate>Mon, 25 Jul 2011 11:50:39 +0000</pubDate>
         <content:encoded><![CDATA[<p><span style="font-size:large;"><strong>Bom dia Pessoal,</strong></span></p>
<p>Hoje iremos ver dois assuntos bem utilizados no nosso dia-a-dia de programação. E para entendermos melhor iremos ver alguns exemplos.</p>
<p>&nbsp;</p>
<p><span style="font-size:medium;"><strong>Assuntos</strong></span></p>
<ul>
<li>Instrução <strong>switch</strong>.</li>
<li>Conceitos básicos e importantes sobre <strong>loops</strong> e <strong>iteradores</strong>.</li>
</ul>
<p>&nbsp;</p>
<p><span style="font-size:medium;"><strong>Instrução switch</strong></span></p>
<p><strong>Regras básicas</strong></p>
<ul>
<li>A expressão <strong>switch</strong> deve avaliar um <strong>char</strong>, <strong>byte</strong>, <strong>short</strong>, <strong>int</strong> ou <strong>Enum</strong>.</li>
<li>O argumento que uma instrução <strong>case</strong> poderá avaliar, deve ser do mesmo <strong>tipo</strong> que a instrução <strong>switch</strong>.</li>
<li>O valor da instrução <strong>case</strong> deve ser uma constante no tempo de compilação.</li>
<li><strong>Não pode</strong> ter instruções <strong>case</strong> como o <strong>mesmo valor</strong>.</li>
<li>Nem toda instrução <strong>case</strong> precisa ter obrigatoriamente a instrução <strong>break</strong>.</li>
<li>Caso <strong>não</strong> tenha uma instrução <strong>break</strong> a JVM irá <strong>executar todos os blocos subsequentes</strong>.</li>
<li>A instrução <strong>default</strong> não precisa estar obrigatoriamente após a ultima instrução <strong>case</strong>.</li>
</ul>
<p>&nbsp;</p>
<p><strong>Veja exemplos e pegadinhas:</strong></p>
<p>1.</p>
<p style="padding-left:30px;"><span style="color:#993366;"><strong>public static void</strong></span> main (String[] args) {</p>
<p style="padding-left:60px;"><span style="color:#993366;"><strong>final int</strong></span> zero = 0;</p>
<p style="padding-left:60px;"><span style="color:#993366;"><strong>final int</strong></span> um;</p>
<p style="padding-left:60px;">um = 1;</p>
<p style="padding-left:60px;"><span style="color:#993366;"><strong>int</strong></span> x = 1;</p>
<p style="padding-left:60px;"><span style="color:#993366;"><strong>switch</strong></span> (x) {</p>
<p style="padding-left:90px;"><span style="color:#993366;"><strong>case</strong></span> zero: <span style="color:#993366;"><strong>break</strong></span>;</p>
<p style="padding-left:90px;"><span style="color:#993366;"><strong>case</strong></span> um: <span style="color:#339966;">// não compila porque não é uma constante em tempo de compilação</span></p>
<p style="padding-left:90px;"><span style="color:#339966;">// apesar de ser final o valor de &#8220;um&#8221; só será atribuido em tempo de execução</span></p>
<p style="padding-left:90px;"><span style="color:#993366;"><strong>break</strong></span>;</p>
<p style="padding-left:60px;">}</p>
<p style="padding-left:30px;">}</p>
<p>2.</p>
<p style="padding-left:30px;"><span style="color:#993366;"><strong>public static void</strong></span> main(String[] args) {</p>
<p style="padding-left:60px;"><span style="color:#993366;"><strong>byte</strong></span> x = 1;</p>
<p style="padding-left:60px;"><span style="color:#993366;"><strong>switch</strong></span> (x) {</p>
<p style="padding-left:90px;"><span style="color:#993366;"><strong>case</strong></span> 1: <span style="color:#993366;"><strong>break</strong></span>;</p>
<p style="padding-left:90px;"><span style="color:#993366;"><strong>case</strong></span> 128: <span style="color:#339966;">// não compila porque 128 é maior que um byte</span></p>
<p style="padding-left:90px;"><span style="color:#993366;"><strong>break</strong></span> ;</p>
<p style="padding-left:60px;">}</p>
<p style="padding-left:30px;">}</p>
<p>3.</p>
<p style="padding-left:30px;"><span style="color:#993366;"><strong>enum</strong></span> Teste { UM, DOIS, TRES }</p>
<p style="padding-left:30px;"><span style="color:#993366;"><strong>public static void</strong></span> main(String[] args) {</p>
<p style="padding-left:60px;">Teste x = Teste.DOIS;</p>
<p style="padding-left:60px;"><span style="color:#993366;"><strong>switch</strong></span> (x) {</p>
<p style="padding-left:90px;"><span style="color:#993366;"><strong>case</strong></span> UM : System.<span style="color:#3366ff;"><em>out</em></span>.println(<span style="color:#3366ff;">&#8220;UM&#8221;</span>); <span style="color:#993366;"><strong>break</strong></span>;</p>
<p style="padding-left:90px;"><span style="color:#993366;"><strong>case</strong></span> DOIS: System.<em><span style="color:#3366ff;">out</span></em>.println(<span style="color:#3366ff;">&#8220;DOIS&#8221;</span>); <span style="color:#339966;">// nao tem break. Executa todos os subsequentes</span></p>
<p style="padding-left:90px;"><span style="color:#993366;"><strong>case</strong></span> TRES: System.<em><span style="color:#3366ff;">out</span></em>.println(<span style="color:#3366ff;">&#8220;TRES&#8221;</span>); <span style="color:#993366;"><strong>break</strong></span>;</p>
<p style="padding-left:60px;">}</p>
<p style="padding-left:30px;">}</p>
<p><strong>Resultado Console</strong></p>
<p style="padding-left:30px;">DOIS</p>
<p style="padding-left:30px;">TRES</p>
<p>4.</p>
<p style="padding-left:30px;"><span style="color:#993366;"><strong>enum</strong></span> Teste { <em><span style="color:#3366ff;">UM</span></em>, <span style="color:#3366ff;"><em>DOIS</em></span>, <span style="color:#3366ff;"><em>TRES</em></span>, <span style="color:#3366ff;"><em>CEM</em></span> }</p>
<p style="padding-left:30px;"><span style="color:#993366;"><strong>public static void</strong></span> main(String[] args) {</p>
<p style="padding-left:60px;">Teste x = Teste.<em><span style="color:#3366ff;">CEM</span></em>;</p>
<p style="padding-left:60px;"><span style="color:#993366;"><strong>switch</strong></span> (x) {</p>
<p style="padding-left:90px;"><span style="color:#993366;"><strong>case</strong></span> <span style="color:#3366ff;"><em>UM</em></span>: System.<span style="color:#3366ff;"><em>out</em></span>.println(<span style="color:#3366ff;">&#8220;UM&#8221;</span>); <span style="color:#993366;"><strong>break</strong></span>;</p>
<p style="padding-left:90px;"><span style="color:#993366;"><strong>default</strong></span>: System.<span style="color:#3366ff;"><em>out</em></span>.println(<span style="color:#3366ff;">&#8220;default&#8221;</span>); <span style="color:#339966;">// nao tem break. Executa todos os subsequentes</span></p>
<p style="padding-left:90px;"><span style="color:#993366;"><strong>case</strong></span> <span style="color:#3366ff;"><em>DOIS</em></span>: System.<span style="color:#3366ff;"><em>out</em></span>.println(<span style="color:#3366ff;">&#8220;DOIS&#8221;</span>);</p>
<p style="padding-left:90px;"><span style="color:#993366;"><strong>case</strong></span> <span style="color:#3366ff;"><em>TRES</em></span>: System.<span style="color:#3366ff;"><em>out</em></span>.println(<span style="color:#3366ff;">&#8220;TRES&#8221;</span>); <span style="color:#993366;"><strong>break</strong></span>;</p>
<p style="padding-left:60px;">}</p>
<p style="padding-left:30px;">}</p>
<p>5.</p>
<p style="padding-left:30px;"><span style="color:#993366;"><strong>enum</strong></span> Teste { <span style="color:#3366ff;"><em>UM</em></span>, <span style="color:#3366ff;"><em>DOIS</em></span>, <span style="color:#3366ff;"><em>TRES</em></span>, <span style="color:#3366ff;"><em>CEM</em></span> }</p>
<p style="padding-left:30px;"><span style="color:#993366;"><strong>public static void</strong></span> main(String[] args) {</p>
<p style="padding-left:60px;">Teste x = Teste.<em><span style="color:#3366ff;">CEM</span></em>;</p>
<p style="padding-left:60px;"><span style="color:#993366;"><strong>switch</strong></span> (x) {</p>
<p style="padding-left:90px;"><span style="color:#993366;"><strong>case</strong></span> <span style="color:#3366ff;"><em>UM</em></span>: System.<em>out</em>.println(<span style="color:#3366ff;">&#8220;UM&#8221;</span>); <span style="color:#993366;"><strong>break</strong></span>;</p>
<p style="padding-left:90px;"><span style="color:#993366;"><strong>case</strong></span> <span style="color:#3366ff;"><em>DOIS</em></span>: System.<em>out</em>.println(<span style="color:#3366ff;">&#8220;DOIS&#8221;</span>); <span style="color:#993366;"><strong>break</strong></span>;</p>
<p style="padding-left:90px;"><span style="color:#993366;"><strong>case</strong></span> <span style="color:#3366ff;"><em>TRES</em></span>: System.<em>out</em>.println(<span style="color:#3366ff;">&#8220;TRES&#8221;</span>); <span style="color:#993366;"><strong>break</strong></span>; <span style="color:#339966;">// não compila porque está repetindo na instrução abaixo</span></p>
<p style="padding-left:90px;"><span style="color:#993366;"><strong>case</strong></span> <span style="color:#3366ff;"><em>TRES</em></span>: System.<em>out</em>.println(<span style="color:#3366ff;">&#8220;TRES&#8221;</span>); <span style="color:#993366;"><strong>break</strong></span>;</p>
<p style="padding-left:60px;">}</p>
<p style="padding-left:30px;">}</p>
<p>&nbsp;</p>
<p><strong>Conceitos básicos e importantes sobre Loops e Iteradores</strong></p>
<p>Em Java podemos fazer <strong>loops</strong> em três formas diferentes: <strong>while</strong>, <strong>do</strong>, <strong>for</strong>.</p>
<p>&nbsp;</p>
<p><strong>Usando loops &#8220;while&#8221;</strong></p>
<ol>
<li>O corpo do bloco <strong>while</strong> será executado até que a expressão retorne <strong>false</strong>, ou seja, só será executado o corpo caso a expressão retorne <strong>true</strong>.</li>
</ol>
<p style="padding-left:60px;"><span style="color:#993366;"><strong>while</strong></span> (expressaoBoolean){</p>
<p style="padding-left:60px;"><span style="color:#339966;">// corpo</span></p>
<p style="padding-left:60px;">}</p>
<p>&nbsp;</p>
<p><strong>Usando loops &#8220;do&#8221;</strong></p>
<ol>
<li>O corpo do bloco <strong>do</strong> sempre será <strong>executado a primeira vez</strong> e as próximas só serão executadas quando a expressão retorne <strong>true</strong>.</li>
</ol>
<p style="padding-left:60px;"><span style="color:#993366;"><strong>do</strong></span> {</p>
<p style="padding-left:60px;"><span style="color:#339966;">// corpo</span></p>
<p style="padding-left:60px;">} <span style="color:#993366;"><strong>while</strong></span> (expressaoBoolean);</p>
<p style="padding-left:60px;">&nbsp;</p>
<p><strong>Usando loops &#8220;for (simples)&#8221; e &#8220;for-each (aprimorado)&#8221;</strong></p>
<ol>
<li>A estrutura do <strong>for (simples)</strong> é dividida em três partes: Inicialização, Condição e Iteração.</li>
<li>O corpo do <strong>for (simples)</strong> será executado até que a Condição falhe, ou seja, retorne <strong>false</strong>.</li>
<li>As partes do <strong>for (simples)</strong> não são obrigatórios</li>
<li>A estrutura do <strong>for-each (aprimorado)</strong> é dividida em duas partes: Declaração e Expressão(Array).</li>
<li>O corpo do <strong>for-each (aprimorado)</strong> será executado até que a Expressão (Array) tenha conteúdo.</li>
</ol>
<p>&nbsp;</p>
<p style="padding-left:60px;"><span style="color:#339966;">// for (simples)</span></p>
<p style="padding-left:60px;"><span style="color:#339966;">// compila porque as partes nao sao obrigatorias</span></p>
<p style="padding-left:60px;"><span style="color:#993366;"><strong>for</strong></span> (<span style="color:#339966;">/* Inicializacao */</span> ; <span style="color:#339966;">/* Condicao */</span> ; <span style="color:#339966;">/* Iteracao */</span>){</p>
<p style="padding-left:60px;"><span style="color:#339966;">// corpo</span></p>
<p style="padding-left:60px;">}</p>
<p>&nbsp;</p>
<p style="padding-left:60px;"><span style="color:#339966;">// for-each (aprimorado)</span></p>
<p style="padding-left:60px;"><span style="color:#993366;"><strong>int</strong></span>[] array = { 1, 2, 3, 4 };</p>
<p style="padding-left:60px;"><span style="color:#993366;"><strong>for</strong></span> (<span style="color:#993366;"><strong>int</strong></span> i : array) {</p>
<p style="padding-left:90px;"><span style="color:#339966;">// corpo</span></p>
<p style="padding-left:90px;">System.<span style="color:#3366ff;"><em>out</em></span>.println(i);</p>
<p style="padding-left:60px;">}</p>
<p>&nbsp;</p>
<p><strong>Usando continue e break</strong></p>
<ol>
<li>A palavra <strong>continue</strong> encerra a execução do corpo e vai para o próximo item do <strong>loop</strong>.</li>
<li>A palavra <strong>break</strong> encerra a execução do <strong>loop</strong> e vai para o próximo comando abaixo do <strong>loop</strong>.</li>
</ol>
<p>&nbsp;</p>
<p>Mas se tem um <strong>loop</strong> dentro do outro como determinar qual deve ser parado?</p>
<p>Simples. Criando um <strong>alias</strong>. Veja o exemplo abaixo:</p>
<p style="padding-left:30px;"><span style="color:#993366;"><strong>int</strong></span>[] array = { 1, 2, 3, 4 };</p>
<p style="padding-left:30px;"><span style="color:#993366;"><strong>boolean</strong></span> teste = <span style="color:#993366;"><strong>false</strong></span>;</p>
<p style="padding-left:30px;">aliasFor : <span style="color:#993366;"><strong>for</strong></span> (<span style="color:#993366;"><strong>int</strong></span> i : array) {</p>
<p style="padding-left:60px;">System.<em><span style="color:#3366ff;">out</span></em>.println(i);</p>
<p style="padding-left:60px;"><span style="color:#993366;"><strong>while</strong></span> (teste){</p>
<p style="padding-left:60px;"><span style="color:#993366;"><strong>break</strong></span> aliasFor;</p>
<p style="padding-left:30px;">}</p>
<p style="padding-left:30px;">teste = <span style="color:#993366;"><strong>true</strong></span>;</p>
<p style="padding-left:30px;">}</p>
<p><strong>Resultado</strong>:</p>
<p style="padding-left:30px;">1</p>
<p style="padding-left:30px;">2</p>
<p>&nbsp;</p>
<p><strong>É isso ai pessoal, compartilhem, comentem e estudem!</strong></p>
<p>&nbsp;</p>
<p><em>Escrito por Marcos Oto Picarelli Prado</em></p>
<img src="http://feeds.feedburner.com/~r/dextra-jblog/~4/NSHuO3-CF2A" height="1" width="1" alt=""/>]]></content:encoded>
      </item>
      <item>
         <title>[013] Controle de fluxo, exceções e assertivas</title>
         <link>http://feedproxy.google.com/~r/dextra-jblog/~3/K-lluC4gIbs/</link>
         <description>&lt;p&gt;&lt;span style=&quot;font-size:large;&quot;&gt;&lt;strong&gt;Bom dia pessoal,&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;vamos começar a ver nesse capítulo os controles de fluxo mais utilizados.&lt;/p&gt;
&lt;p&gt;&amp;#160;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size:medium;&quot;&gt;&lt;strong&gt;Assuntos&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;if&lt;/strong&gt;, &lt;strong&gt;else&lt;/strong&gt; e &lt;strong&gt;else if&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;#160;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size:medium;&quot;&gt;&lt;strong&gt;Regras&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A expressão avaliada deve ser obrigatoriamente um valor &lt;strong&gt;boolean&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Não precisa obrigatoriamente ter as chaves&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&amp;#8230;&lt;/p&gt;</description>
         <guid isPermaLink="false">http://blogs.dextra.com.br/?p=422</guid>
         <pubDate>Wed, 20 Jul 2011 13:34:04 +0000</pubDate>
         <content:encoded><![CDATA[<p><span style="font-size:large;"><strong>Bom dia pessoal,</strong></span></p>
<p>vamos começar a ver nesse capítulo os controles de fluxo mais utilizados.</p>
<p>&nbsp;</p>
<p><span style="font-size:medium;"><strong>Assuntos</strong></span></p>
<ul>
<li><strong>if</strong>, <strong>else</strong> e <strong>else if</strong></li>
</ul>
<p>&nbsp;</p>
<p><span style="font-size:medium;"><strong>Regras</strong></span></p>
<ul>
<li>A expressão avaliada deve ser obrigatoriamente um valor <strong>boolean</strong>.</li>
<li>Não precisa obrigatoriamente ter as chaves {  } (begin, end respectivamente).</li>
<li>Quando não aparecer as chaves será executada apenas a primeira linha abaixo da condição  <strong>if</strong>, <strong>else</strong> ou <strong>else if</strong>.</li>
<li>Quando não aparecer as chaves e aparecer a condição <strong>else</strong> ou <strong>else if</strong>, a mesma pertencerá ao <strong>if</strong> mais próximo. Veja o exemplo abaixo:</li>
</ul>
<p style="padding-left:30px;"><span style="color:#993366;"><strong>public static void</strong></span> main(String[] args) {</p>
<p style="padding-left:60px;"><span style="color:#993366;"><strong>boolean</strong></span> ok = <span style="color:#993366;"><strong>false</strong></span>; <span style="color:#993366;"><strong>boolean</strong></span> testeOk = <span style="color:#993366;"><strong>false</strong></span>;</p>
<p style="padding-left:60px;"><span style="color:#993366;"><strong>if</strong></span> (ok)</p>
<p style="padding-left:90px;"><span style="color:#993366;"><strong>if</strong></span> (testeOk)</p>
<p style="padding-left:120px;">System.<span style="color:#3366ff;"><em>out</em></span>.println(<span style="color:#3366ff;">&#8220;Teste Ok!&#8221;</span>);</p>
<p style="padding-left:60px;"><span style="color:#993366;"><strong>else</strong></span></p>
<p style="padding-left:90px;">System.<span style="color:#3366ff;"><em>out</em></span>.println(<span style="color:#3366ff;">&#8220;Nao Ok&#8221;</span>);</p>
<p style="padding-left:30px;">}</p>
<p>No exemplo acima você se <strong>engana</strong> pela <strong>identação</strong> e pela <strong>falta das chaves</strong> begin e end, e acha que irá imprimir &#8220;Nao Ok&#8221; no console, mas na verdade não irá imprimir nada. Porque o <strong>else</strong> pertence ao <strong>if</strong> mais próximo.</p>
<p>&nbsp;</p>
<p><strong>Outra pegadinha:</strong></p>
<p style="padding-left:30px;"><span style="color:#993366;"><strong>public static void main</strong></span>(String[] args) {</p>
<p style="padding-left:60px;"><span style="color:#993366;"><strong>boolean</strong></span> ok = <span style="color:#993366;"><strong>false</strong></span>;</p>
<p style="padding-left:60px;"><span style="color:#993366;"><strong>if </strong></span>(ok = <span style="color:#993366;"><strong>true</strong></span>)</p>
<p style="padding-left:90px;">System.<span style="color:#3366ff;"><em>out</em></span>.println(<span style="color:#3366ff;">&#8220;Ok&#8221;</span>);</p>
<p style="padding-left:30px;">}</p>
<p>O exemplo acima você pode imaginar 3 coisas:</p>
<ul>
<li>O código não irá compilar porque o operador é de atribuição é não de igualdade</li>
<li>A condição será <strong>false</strong> porque o atributo tem o valor <strong>false</strong> anteriormente.</li>
<li>A condição será <strong>true</strong> porque atribuiu o valor <strong>true</strong>.</li>
</ul>
<p>A terceira está correta porque <strong>ok</strong> é <strong>boolean</strong> e a JVM <strong>primeiro</strong> executa a <strong>expressão</strong> e <strong>depois avalia</strong>, imagine que <strong>ok = true</strong> é um método que retorna <strong>boolean</strong>.</p>
<p>&nbsp;</p>
<p>Outro exemplo interessante:</p>
<p style="padding-left:30px;"><span style="color:#993366;"><strong>public static void</strong></span> main (String[] args) {</p>
<p style="padding-left:60px;"><span style="color:#993366;"><strong>int</strong></span> b;</p>
<p style="padding-left:60px;"><span style="color:#993366;"><strong>boolean</strong></span> a = true;</p>
<p style="padding-left:60px;"><span style="color:#993366;"><strong>if</strong></span> (a) {</p>
<p style="padding-left:90px;">b = 10;</p>
<p style="padding-left:60px;">}</p>
<p style="padding-left:60px;">System.<span style="color:#3366ff;"><em>out</em></span>.println(b);</p>
<p style="padding-left:30px;">}</p>
<p>Esse código <strong>não compila</strong>, pois a JVM reclama que a variável <strong>b</strong> não foi inicializada.</p>
<p>&nbsp;</p>
<p style="padding-left:30px;"><span style="color:#993366;"><strong>public static void</strong></span> main(String[] args) {</p>
<p style="padding-left:60px;"><span style="color:#993366;"><strong>int</strong></span> b;</p>
<p style="padding-left:60px;"><span style="color:#993366;"><strong>if</strong></span> (<span style="color:#993366;"><strong>true</strong></span>) {</p>
<p style="padding-left:90px;">b = 10;</p>
<p style="padding-left:60px;">}</p>
<p style="padding-left:60px;">System.<span style="color:#3366ff;"><em>out</em></span>.println(b);</p>
<p style="padding-left:30px;">}</p>
<p>Esse código <strong>compila</strong>, pois a JVM entende que com certeza vai entrar no <strong>if</strong>.</p>
<p>&nbsp;</p>
<p><strong>É isso ai pessoal, compartilhem, comentem e estudem!</strong></p>
<p>&nbsp;</p>
<p><em>Escrito por Marcos Oto Picarelli Prado</em></p>
<img src="http://feeds.feedburner.com/~r/dextra-jblog/~4/K-lluC4gIbs" height="1" width="1" alt=""/>]]></content:encoded>
      </item>
      <item>
         <title>Tecnologias de Full Text Search</title>
         <link>http://feedproxy.google.com/~r/dextra-corporativo/~3/2nQf_hjfMu4/</link>
         <description>&lt;p&gt;&lt;span style=&quot;color:#333333;&quot;&gt;&lt;span style=&quot;font-family:Arial, sans-serif;&quot;&gt;&lt;span style=&quot;font-size:small;&quot;&gt;&lt;strong&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://blogs.dextra.com.br/wp-content/uploads/2011/02/module-full-text-search.jpg&quot;&gt;&lt;img class=&quot;size-medium wp-image-89 alignleft&quot; title=&quot;module-full-text-search&quot; src=&quot;http://blogs.dextra.com.br/wp-content/uploads/2011/02/module-full-text-search-300x155.jpg&quot; alt=&quot;&quot; width=&quot;300&quot; height=&quot;155&quot;/&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color:#333333;&quot;&gt;&lt;span style=&quot;font-family:Arial, sans-serif;&quot;&gt;&lt;span style=&quot;font-size:small;&quot;&gt;Desde o surgimento de buscadores da internet, como o Yahoo e principalmente após o surgimento do Google, os usuários de sistemas corporativos cada vez mais sentiram  a necessidade de obter informações de maneira rápida e eficiente. Usar mecanismos de&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&amp;#8230;&lt;/p&gt;</description>
         <guid isPermaLink="false">http://blogs.dextra.com.br/?p=66</guid>
         <pubDate>Fri, 18 Feb 2011 19:49:58 +0000</pubDate>
         <content:encoded/>
      </item>
      <item>
         <title>I Dextra Coding Dojo – Desafio BDD com Rspec, Cucumber e Ruby</title>
         <link>http://feedproxy.google.com/~r/dextra-corporativo/~3/5q34oMhH7Ak/</link>
         <description>&lt;p style=&quot;text-align:left;&quot;&gt;
&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://blogs.dextra.com.br/wp-content/uploads/2011/02/dojo-dextra1.jpg&quot;&gt;&lt;img class=&quot;size-medium wp-image-75 alignleft&quot; title=&quot;I Dextra Coding Dojo&quot; src=&quot;http://blogs.dextra.com.br/wp-content/uploads/2011/02/dojo-dextra1-300x206.jpg&quot; alt=&quot;&quot; width=&quot;300&quot; height=&quot;206&quot;/&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p style=&quot;text-align:left;&quot;&gt;
&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;em&gt;Faltam menos de 7 dias para o I Dextra Coding Dojo.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Olhando aqui por cima, vejo que os nossos “Atletas Dextra” aparentam estar em plena forma para o desafio:&amp;#8230;&lt;/p&gt;</description>
         <guid isPermaLink="false">http://blogs.dextra.com.br/?p=64</guid>
         <pubDate>Tue, 08 Feb 2011 19:49:03 +0000</pubDate>
         <content:encoded/>
      </item>
      <item>
         <title>Dextra é patrocinadora do Ruby Masters Conf – Edição 2</title>
         <link>http://feedproxy.google.com/~r/dextra-corporativo/~3/XnGn7NjQhko/</link>
         <description>&lt;p&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://blogs.dextra.com.br/wp-content/uploads/2010/08/ruby.gif&quot;&gt;&lt;img class=&quot;size-full wp-image-64 alignleft&quot; title=&quot;ruby&quot; src=&quot;http://blogs.dextra.com.br/wp-content/uploads/2010/08/ruby.gif&quot; alt=&quot;&quot; width=&quot;141&quot; height=&quot;143&quot;/&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Dia 25 e 26 de fevereiro acontecerá mais uma edição do Ruby Masters Conf,  maratona de palestras on-line  que contará com grandes nomes da comunidade Ruby e Rails internacional e Brasileira.&lt;/p&gt;
&lt;p&gt;O evento tem por objetivo compartilhar o conhecimento&amp;#8230;&lt;/p&gt;</description>
         <guid isPermaLink="false">http://blogs.dextra.com.br/?p=62</guid>
         <pubDate>Tue, 01 Feb 2011 20:48:26 +0000</pubDate>
         <content:encoded/>
         <category>Blog Corporativo</category>
      </item>
      <item>
         <title>Alta disponibilidade e alta performance com PostgreSQL 9.0 + Pgpool-II</title>
         <link>http://feedproxy.google.com/~r/dextra-bd/~3/CcrDAO-yQI4/</link>
         <description>&lt;h1&gt;&lt;span style=&quot;font-family:Arial, sans-serif;&quot;&gt;&lt;span style=&quot;font-size:x-small;&quot;&gt;Por Matheus Ricardo Espanhol  &amp;#8211; Dextra Sistemas&lt;/span&gt;&lt;/span&gt;&lt;/h1&gt;
&lt;p&gt;Com o novo modelo de replicação do PostgreSQL, torna-se viável a utilização de  balanceamento de carga nas operações de leitura, uma vez que os servidores de contingência permanecem em modo &lt;em&gt;read-only&lt;/em&gt; (Hot Standby).&amp;#8230;&lt;/p&gt;</description>
         <guid isPermaLink="false">http://blogs.dextra.com.br/?p=31</guid>
         <pubDate>Mon, 31 Jan 2011 10:11:02 +0000</pubDate>
         <content:encoded><![CDATA[<h1><span style="font-family:Arial, sans-serif;"><span style="font-size:x-small;">Por Matheus Ricardo Espanhol  &#8211; Dextra Sistemas</span></span></h1>
<p>Com o novo modelo de replicação do PostgreSQL, torna-se viável a utilização de  balanceamento de carga nas operações de leitura, uma vez que os servidores de contingência permanecem em modo <em>read-only</em> (Hot Standby). Até a versão 8.4, o balanceamento de carga só era possível se utilizado juntamente com ferramentas de replicação de terceiros, por exemplo Slony.</p>
<p>Apesar de ser uma replicação Master/Slave assíncrona, a funcionalidade Streaming Replication do PostgreSQL 9.0 garante uma replicação consistente e com atraso praticamente imperceptível para o usuário final. Este comportamento viabiliza a utilização dos servidores de contingência, denominados slaves, como fonte de dados atualizada, reduzindo a carga de leitura sobre o servidor master.</p>
<p>A ferramenta Pgpool-II possui a funcionalidade de balanceamento de carga, que visa distribuir operações de leitura entre os servidores envolvidos. Pensando na popularidade da replicação do PostgreSQL 9.0, o grupo de desenvolvedores do Pgpool-II acrescentou algumas funcionalidades específicas de integração com a nova versão do PostgreSQL, lançando a versão 3.0 do Pgpool-II.</p>
<p>A seguir um cenário possível envolvendo PostgreSQL 9.0 e Pgpool-II 3.0:</p>
<p><a rel="nofollow" target="_blank" href="http://blogs.dextra.com.br/wp-content/uploads/2011/01/1.gif"><img class="size-full wp-image-86 alignleft" title="1" src="http://blogs.dextra.com.br/wp-content/uploads/2011/01/1.gif" alt="" width="536" height="663"/></a></p>
<p lang="en-US"><span style="font-family:Arial, sans-serif;">Pgpool-II é um software intermediário(</span><span style="font-family:Arial, sans-serif;"><em>middleware</em></span><span style="font-family:Arial, sans-serif;">) entre a aplicação(</span><span style="font-family:Arial, sans-serif;"><em>frontend</em></span><span style="font-family:Arial, sans-serif;">) e o  servidor PostgreSQL(</span><span style="font-family:Arial, sans-serif;"><em>backend</em></span><span style="font-family:Arial, sans-serif;">). Age de forma transparente e suporta até 128 nós de replicação. Pode-se considerar as seguintes funcionalidades principais:<strong> </strong></span></p>
<p lang="en-US">
<p lang="en-US"><span style="font-family:Arial, sans-serif;"><strong>Pooling de conexões (Aglomerador 	de conexões)</strong></span></p>
<ul>
<li> <span style="font-family:Arial, sans-serif;">Mantém conexões abertas com o 		servidor PostgreSQL, reutilizando-as para novas conexões com as 		mesmas propriedades. </span></li>
<li> <span style="font-family:Arial, sans-serif;">Reduz 		o overhead causado pela abertura de novos processos (fork) no 		servidor PostgreSQL. </span></li>
</ul>
<p><a rel="nofollow" target="_blank" href="http://blogs.dextra.com.br/wp-content/uploads/2011/01/2.gif"><img class="size-full wp-image-87 alignleft" title="2" src="http://blogs.dextra.com.br/wp-content/uploads/2011/01/2.gif" alt="" width="527" height="328"/></a></p>
<p><strong><em>Fonte:</em></strong><em> Pgpool Global Development Group</em></p>
<p><span style="font-family:Arial, sans-serif;">As conexões são fechadas entre o usuário e o Pgpool-II. O usuário devolve a conexão ao pool,  mas as mesmas persistem no servidor de banco de dados para reutilização:</span></p>
<p><span style="font-family:Arial, sans-serif;"><a rel="nofollow" target="_blank" href="http://blogs.dextra.com.br/wp-content/uploads/2011/01/3.gif"><img class="size-full wp-image-88 alignleft" title="3" src="http://blogs.dextra.com.br/wp-content/uploads/2011/01/3.gif" alt="" width="515" height="262"/></a></span></p>
<p><strong><em>Fonte:</em></strong><em> Pgpool Global Development Group</em></p>
<p><span style="font-family:Arial, sans-serif;"><strong>Replicação</strong></span></p>
<p><span style="font-family:Arial, sans-serif;">Permite 		o envio de todas as operações para todos os servidores PostgreSQL 		envolvidos.<strong> </strong></span></p>
<p><span style="font-family:Arial, sans-serif;"><strong>Balanceamento 	de carga</strong></span></p>
<p><span style="font-family:Arial, sans-serif;">Distribui 		consultas de forma aleatória entre os servidores PostgreSQL 		envolvidos.</span></p>
<p><span style="font-family:Arial, sans-serif;"><a rel="nofollow" target="_blank" href="http://blogs.dextra.com.br/wp-content/uploads/2011/01/4.gif"><img class="size-full wp-image-89 alignleft" title="4" src="http://blogs.dextra.com.br/wp-content/uploads/2011/01/4.gif" alt="" width="541" height="252"/></a></span></p>
<p><strong><em>Fonte:</em></strong><em> Pgpool Global Development Group</em></p>
<p lang="en-US"><span style="font-family:Arial, sans-serif;"><strong>Consultas paralelas</strong></span></p>
<p lang="en-US"><span style="font-family:Arial, sans-serif;">Particiona 		tabelas entre os servidores envolvidos, possibilitando a execução 		de consultas ao mesmo tempo sobre conjuntos diferentes de dados.</span><span style="font-family:Arial, sans-serif;">A funcionalidade de replicação do Pgpool-II não oferece a consistência necessária para a maioria das aplicações. O modelo de replicação é conhecido como Dual-master, sendo baseado em comandos. Desta forma os comandos são executados em cada servidor, tornando possível a existência de bases de dados com informações diferentes quando utilizadas funções que retiram informações do servidor. Por exemplo: now() e random().</span></p>
<p><span style="font-family:Arial, sans-serif;">A paralelização de consultas não é o foco deste artigo, mais informações sobre estas funcionalidades estão disponíveis no site do projeto </span><span style="color:#0000ff;"><span style="text-decoration:underline;"><a rel="nofollow" target="_blank" href="http://pgpool.projects.postgresql.org/"><span style="font-family:Arial, sans-serif;">http://pgpool.projects.postgresql.org/</span></a></span></span><span style="font-family:Arial, sans-serif;">.</span></p>
<p><span style="font-family:Arial, sans-serif;">Para o ambiente em questão utiliza-se apenas as füncionalidades de pool de conexões e balanceamento de carga. </span></p>
<p><strong><span style="font-family:Arial, sans-serif;">A versão 3.0 do Pgpool-II provê a este ambiente, as seguintes características:</span></strong></p>
<ul>
<li><span style="font-family:Arial, sans-serif;">Failover automático através da 			detecção de falha no processo monitor do Pgpool-II e execução 			de comando definido no parâmetro </span><span style="font-family:Arial, sans-serif;"><em><strong>failover_command</strong></em></span><span style="font-family:Arial, sans-serif;">;</span></li>
<li><span style="font-family:Arial, sans-serif;">Modo 			de balanceamento Master/Slave específico para Streaming 			Replication;</span></li>
<li><span style="font-family:Arial, sans-serif;">Interpretação 			de comandos (</span><span style="font-family:Arial, sans-serif;"><em>parser</em></span><span style="font-family:Arial, sans-serif;">) 			para distinguir comandos de alteração e consultas;</span></li>
<li><span style="font-family:Arial, sans-serif;">Verificação 			do atraso do servidor slave em relação ao master. Caso o atraso 			exceda o valor definido no parâmetro </span><span style="font-family:Arial, sans-serif;"><em><strong>delay_threshold</strong></em></span><span style="font-family:Arial, sans-serif;">, 			as consultas só serão enviadas ao servidor master;</span></li>
<li><span style="font-family:Arial, sans-serif;">Possibilidade de adição de 			servidores slaves sem reiniciar o serviço do Pgpool.</span></li>
</ul>
<p><a rel="nofollow" target="_blank" href="http://blogs.dextra.com.br/wp-content/uploads/2011/01/5.gif"><img class="size-full wp-image-90 alignleft" title="5" src="http://blogs.dextra.com.br/wp-content/uploads/2011/01/5.gif" alt="" width="539" height="265"/></a></p>
<p><span style="font-family:Arial, sans-serif;">Para que o próprio servidor do Pgpool-II não seja um ponto único de falha, pode-se configurar uma réplica do servidor. O script </span><span style="font-family:Arial, sans-serif;"><strong>pgpool-HA</strong></span><span style="font-family:Arial, sans-serif;"> é um recurso do software Heartbeat que pode garantir o serviço do Pgpool-II sempre ativo independente do servidor.</span></p>
<p><span style="font-family:Arial, sans-serif;">A ferramenta web </span><span style="font-family:Arial, sans-serif;"><strong>Pgpooladmin</strong></span><span style="font-family:Arial, sans-serif;"> pode auxiliar na administração das funcionalidades do Pgpool-II. Instalada no próprio servidor do Pgpool-II ela facilita tarefas de monitoramento, administração do processo e alterações na configuração. Estas ferramentas auxiliares estão disponíveis no site do projeto </span><span style="color:#0000ff;"><span style="text-decoration:underline;"><a rel="nofollow" target="_blank" href="http://pgfoundry.org/projects/pgpool/"><span style="font-family:Arial, sans-serif;">http://pgfoundry.org/projects/pgpool/</span></a></span></span><span style="font-family:Arial, sans-serif;">.</span></p>
<p><span style="font-family:Arial, sans-serif;"><em>A análise de ferramentas de alta disponilidade e desempenho para servidores PostgreSQL é o foco do </em></span><span style="color:#0000ff;"><span style="text-decoration:underline;"><a rel="nofollow" target="_blank" href="http://www.dextra.com.br/servicos/treinamento/pg/postgres-alta-disponibilidade.htm"><span style="font-family:Arial, sans-serif;"><em>Treinamento PostgreSQL Alta disponibilidade</em></span></a></span></span><span style="font-family:Arial, sans-serif;"><em>, promovido pela Dextra Sistemas. Este e outros ambientes são configurados pelos próprios alunos durante treinamento, visando capacitar o aluno na escolha e implantação da tecnologia adequada em ambientes corporativos. </em></span></p>
<p><span style="font-family:Arial, sans-serif;"><em>A Dextra oferece também serviços de <span style="color:#0000ff;"><span style="text-decoration:underline;"><a rel="nofollow" target="_blank" href="http://www.dextra.com.br/postgres/">consultoria</a></span></span> e <span style="color:#0000ff;"><span style="text-decoration:underline;"><a rel="nofollow" target="_blank" href="http://www.dextra.com.br/postgres/">suporte</a></span></span> em várias modalidades, incluindo suporte 24&#215;7, garantindo o desempenho e a alta disponibilidade exigida em servidores de banco de dados.</em></span></p>
<img src="http://feeds.feedburner.com/~r/dextra-bd/~4/CcrDAO-yQI4" height="1" width="1" alt=""/>]]></content:encoded>
      </item>
      <item>
         <title>PostgreSQL 9.0: Replicação hot standby</title>
         <link>http://feedproxy.google.com/~r/dextra-bd/~3/be7V_vLmjHM/</link>
         <description>&lt;p&gt;Até a versão 8.4 o PostgreSQL conta com a replicação conhecida como &lt;code&gt;warm standby&lt;/code&gt;. Esta replicação é baseada em arquivos e não cria um canal de comunicação entre os servidores &lt;code&gt;master&lt;/code&gt; e &lt;code&gt;slave&lt;/code&gt;. Neste tipo de replicação, o servidor master&amp;#8230;&lt;/p&gt;</description>
         <guid isPermaLink="false">http://blogs.dextra.com.br/?p=35</guid>
         <pubDate>Mon, 16 Aug 2010 15:46:04 +0000</pubDate>
         <content:encoded><![CDATA[<p>Até a versão 8.4 o PostgreSQL conta com a replicação conhecida como <code>warm standby</code>. Esta replicação é baseada em arquivos e não cria um canal de comunicação entre os servidores <code>master</code> e <code>slave</code>. Neste tipo de replicação, o servidor master envia segmentos de logs para o servidor slave com os seguintes critérios:</p>
<ul>
<li>ocorrência de <code>checkpoint</code> de acordo com o intervalo de tempo definido no parâmetro <code>checkpoint_timeout</code>;</li>
<li>preenchimento de certa quantidade de segmentos de logs de 16 MB, definida no parâmetro <code>checkpoint_segments</code>;</li>
<li>ocorrência de cópia de segmentos de <code>logs</code> de acordo com intervalo de tempo definido no parâmetro <code>archive_timeout</code>.</li>
</ul>
<p>A ferramenta do <code>contrib</code> do PostgreSQL, <code>pg_standby</code>, inicia um processo no servidor <code>slave</code> que aguarda por segmentos de <code>logs</code> enviados de tempos em tempos pelo servidor <code>master</code> e aplica-os no servidor de contingência. Porém, o servidor de contingência permanece iniciado exclusivamente para o processo <code>pg_standby</code>, ou seja, em modo de recuperação.</p>
<p style="text-align:center;"><a rel="nofollow" target="_blank" href="http://blogs.dextra.com.br/wp-content/uploads/2010/08/master-slave-pg.jpg"><img class="size-full wp-image-72  aligncenter" title="master-slave-pg" src="http://blogs.dextra.com.br/wp-content/uploads/2010/08/master-slave-pg.jpg" alt="Replica&#xe7;&#xe3;o Warm Standby" width="285" height="182"/></a></p>
<p> </p>
<p style="text-align:center;"><span style="font-size:x-small;"><span style="font-family:Times New Roman, serif;">Replicação </span><span style="font-family:Times New Roman, serif;"><em>Warm Standby</em></span></span></p>
<p>Portanto, tem-se nesta solução de alta disponibilidade um intervalo razoável de atualização do servidor <code>slave</code>, além do mesmo não permitir acesso para consultas.<br />
A partir da versão 9.0, a opção da criação de um canal de comunicação (<code>stream</code>) entre os servidores foi implementada, tornando a replicação mais eficiente. Esta nova funcionalidade é chamada de <code>streaming replication</code>.</p>
<p>A <code>streaming replication</code> permite que um servidor <code>slave</code> permaneça em comunicação constante como servidor <code>master</code>, facilitando o recebimento de segmentos de <code>logs</code>. Isto é possível devido aos processos <code>Walreceiver</code> e <code>Walsender</code>, iniciados nos servidores <code>slave</code> e <code>master</code> respectivamente. Esses processos utilizam um canal de comunicação criado via TCP/IP. A criação desse canal inicia-se quando o <code>Walreceiver</code> envia uma requisição de conexão ao servidor <code>master</code>, se a conexão for estabelecida, o processo <code>Walsender</code> é criado. A partir de então o <code>Walsender</code> envia ao <code>Walreceiver</code> as alterações efetivadas no servidor <code>master</code> a serem aplicadas no servidor <code>slave</code>.</p>
<p>Diferente da replicação <code>warm standby</code>, a <code>streaming replication</code> envia somente as alterações, sem considerar critérios de rotação de segmentos de <code>logs</code> definidos no servidor <code>master</code>.</p>
<p>Assim como na <code>warm standby</code>, a <code>streaming replication</code> também é uma replicação assíncrona, por isso ainda há um pequeno atraso entre submeter uma transação no servidor <code>master</code> e essas mudanças se tornarem visíveis no servidor <code>slave</code>. O atraso, no entanto, é muito menor se comparado com o envio de <code>logs</code> baseado em arquivo.</p>
<p><a rel="nofollow" target="_blank" href="http://blogs.dextra.com.br/wp-content/uploads/2010/08/streaming-replication.jpg"><img class="aligncenter size-full wp-image-73" title="streaming-replication" src="http://blogs.dextra.com.br/wp-content/uploads/2010/08/streaming-replication.jpg" alt="Replica&#xe7;&#xe3;o Streaming Replication/Hot Standby" width="437" height="234"/></a></p>
<p></p>
<p style="text-align:center;"><span style="font-size:x-small;">Replicação <em>Streaming Replication/Hot Standby</em></span></p>
<p>Um indicador importante da eficiência da <code>streaming</code> <code>replication</code> é a quantidade de registros do <code>WAL</code> gerados no servidor <code>master</code>, mas ainda não aplicado no servidor <code>slave</code>. Pode-se calcular esse atraso, comparando a localização atual do <code>WAL</code> no servidor <code>master</code> com a localização do <code>WAL</code> recebido pelo servidor <code>slave</code>. Essas informações podem ser recuperadas usando as funções <code>pg_current_xlog_location</code> no servidor <code>master </code>e <code>pg_last_xlog_receive_location</code> no servidor <code>slave</code>. A ultima localização do <code>WAL</code> recebida pelo servidor <code>slave</code> também é exibida no status do processo <code>Walreceiver</code>.</p>
<p>Além desta nova característica, o sistema de replicação nativo do PostgreSQL, conta com uma nova funcionalidade, na qual as bases replicadas permanecem em modo <code>read-only</code>, onde são possíveis somente comandos de leitura (<code>hot standby</code>).</p>
<p>O termo <code>hot standby</code> se refere à capacidade do servidor <code>slave</code> mover operações de recuperação para operações normais, ou seja, possibilitar a execução de consultas ao mesmo tempo em que as alterações efetivadas no servidor <code>master</code> estejam sendo replicadas.  Isto é útil tanto para fins de replicação quanto para restaurar um <code>backup</code> para um estado desejado com grande precisão (<code>PITR</code>).</p>
<p>A replicação <code>streaming replication/hot standby</code> garante a segurança sem afetar  significativamente a performance do servidor de produção. A replicação do servidor <code>maste</code>r para vários slaves possibilita a definição de  estratégias de alta disponibilidade, sem a necessidade de ferramentas de terceiros.</p>
<p>Portanto o PostgreSQL 9.0, realça ainda mais o objetivo da comunidade de software livre em desenvolver um <code>SGBD</code> cada vez mais avançado e robusto. Visando assim, atender as necessidades de  ambientes corporativos que exigem segurança, performance e alta disponibilidade dos dados.</p>
<p>Este tipo de replicação já faz parte do conteúdo do <a rel="nofollow" target="_blank" href="http://www.dextra.com.br/servicos/treinamento/pg/postgres-alta-disponibilidade.htm">curso de Alta Disponibilidade</a> promovido pela Dextra Sistemas. Esta e outras estratégias de replicação praticadas no treinamento, fornecem ao aluno o conhecimento necessário para definir estratégias de alta disponibilidade voltadas a diversos ambientes.</p>
<img src="http://feeds.feedburner.com/~r/dextra-bd/~4/be7V_vLmjHM" height="1" width="1" alt=""/>]]></content:encoded>
      </item>
      <item>
         <title>A Dextra Sistemas está, pelo 2º ano consecutivo, entre as Melhores Empresas de TI do Brasil para Trabalhar!</title>
         <link>http://feedproxy.google.com/~r/dextra-corporativo/~3/IcYiCX0W1D0/</link>
         <description>&lt;p&gt;Olá, Pessoal!&lt;/p&gt;
&lt;p&gt;&lt;img class=&quot;aligncenter size-full wp-image-52&quot; title=&quot;selo-melhores-2010&quot; src=&quot;http://blogs.dextra.com.br/wp-content/uploads/2010/08/selo-melhores-2010.jpg&quot; alt=&quot;selo-melhores-2010&quot; width=&quot;170&quot; height=&quot;120&quot;/&gt;&lt;/p&gt;
&lt;p&gt;É com muita satisfação que informamos que a Dextra, &lt;strong&gt;pelo 2º ano consecutivo, está entre as Melhores Empresas de TI do Brasil para Trabalhar&lt;/strong&gt;!!! É isso mesmo, no dia  21/07/2010 a empresa foi premiada através do ranking&amp;#8230;&lt;/p&gt;</description>
         <guid isPermaLink="false">http://blogs.dextra.com.br/?p=60</guid>
         <pubDate>Wed, 04 Aug 2010 19:47:57 +0000</pubDate>
         <content:encoded/>
         <category>Blog Corporativo</category>
      </item>
      <item>
         <title>Dextra está entre as Melhores Empresas para se Trabalhar TI/Telecom do Brasil</title>
         <link>http://feedproxy.google.com/~r/dextra-corporativo/~3/EXXSVrw0b0o/</link>
         <description>&lt;p style=&quot;text-align:center;&quot;&gt;&lt;img class=&quot;alignnone size-full wp-image-29&quot; title=&quot;selo-melhores2&quot; src=&quot;http://blogs.dextra.com.br/wp-content/uploads/2009/07/selo-melhores2.jpg&quot; alt=&quot;selo-melhores2&quot; width=&quot;170&quot; height=&quot;121&quot;/&gt;&lt;/p&gt;
&lt;p&gt;Olá Pessoal,&lt;/p&gt;
&lt;p&gt;É com muita satisfação que  informamos que a Dextra é uma das melhores empresas para se trabalhar em TI e Telecom!!! É isso mesmo, ontem (15/07/2009) a empresa foi premiada através do ranking promovido pela&amp;#8230;&lt;/p&gt;</description>
         <guid isPermaLink="false">http://blogs.dextra.com.br/?p=58</guid>
         <pubDate>Thu, 16 Jul 2009 19:47:09 +0000</pubDate>
         <content:encoded/>
         <category>Blog Corporativo</category>
      </item>
      <item>
         <title>Woopra – Concorrente do Google Analytics</title>
         <link>http://blogs.dextra.com.br/wblog/2009/woopra-concorrente-do-google-analytics/</link>
         <description>&lt;p&gt;&lt;img title=&quot;Woopra - Ritch Analytics&quot; src=&quot;http://blogs.dextra.com.br/wp-content/uploads/2009/07/woopra.jpg&quot; alt=&quot;&quot; width=&quot;300&quot; height=&quot;178&quot; align=&quot;left&quot;/&gt;­­&lt;/p&gt;
&lt;h2&gt;Apresentando… Woopra­&lt;/h2&gt;
&lt;p&gt;­Foi lançado recentemente um concorrente de peso para o Google Analytics, Woopra.&lt;/p&gt;
&lt;p&gt;Woopra é um sistema de web estatísticas e web tracking digno de notícia.&lt;/p&gt;
&lt;p&gt;Segue abaixo alguns dos recursos e detalhes que você só pode conhecer&amp;#8230;&lt;/p&gt;</description>
         <guid isPermaLink="false">http://blogs.dextra.com.br/?p=52</guid>
         <pubDate>Tue, 07 Jul 2009 10:44:10 +0000</pubDate>
         <content:encoded/>
         <category>WBlog</category>
      </item>
      <item>
         <title>Lançamento: PostgreSQL 8.4</title>
         <link>http://feedproxy.google.com/~r/dextra-bd/~3/EEe2q4BNzZY/</link>
         <description>&lt;div class=&quot;mceTemp mceIEcenter&quot;&gt;
&lt;dl id=&quot;attachment_63&quot; class=&quot;wp-caption  aligncenter&quot; style=&quot;width:162px;&quot;&gt;
&lt;dt class=&quot;wp-caption-dt&quot;&gt;&lt;img class=&quot;size-full wp-image-63&quot; title=&quot;postgresql&quot; src=&quot;http://blogs.dextra.com.br/wp-content/uploads/2009/07/postgresql.png&quot; alt=&quot;postgresql&quot; width=&quot;152&quot; height=&quot;118&quot;/&gt;&lt;/dt&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;p&gt;Olá pessoal,&lt;/p&gt;
&lt;p&gt;Está disponível para &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.postgresql.org/download/&quot;&gt;download&lt;/a&gt; a versão 8.4 do PostgreSQL.&lt;/p&gt;
&lt;p&gt;Após 16 meses de desenvolvimento, foram adicionadas quase 300 melhorias em todos os aspectos&amp;#8230;&lt;/p&gt;</description>
         <guid isPermaLink="false">http://blogs.dextra.com.br/?p=37</guid>
         <pubDate>Thu, 02 Jul 2009 11:47:49 +0000</pubDate>
         <content:encoded><![CDATA[<div class="mceTemp mceIEcenter">
<dl id="attachment_63" class="wp-caption  aligncenter" style="width:162px;">
<dt class="wp-caption-dt"><img class="size-full wp-image-63" title="postgresql" src="http://blogs.dextra.com.br/wp-content/uploads/2009/07/postgresql.png" alt="postgresql" width="152" height="118"/></dt>
</dl>
</div>
<p>Olá pessoal,</p>
<p>Está disponível para <a rel="nofollow" target="_blank" href="http://www.postgresql.org/download/">download</a> a versão 8.4 do PostgreSQL.</p>
<p>Após 16 meses de desenvolvimento, foram adicionadas quase 300 melhorias em todos os aspectos do SGBD, para mais detalhes <a rel="nofollow" target="_blank" href="http://www.postgresql.org/docs/8.4/static/release-8-4.html">clique aqui</a>.</p>
<p>A atualização para a versão 8.4 é altamente recomendada.</p>
<ul>
<li> Foram desenvolvidas e aperfeiçoadas ferramentas de administração e monitoramento.</li>
<li> Novos comandos foram adicionados para tornar a programação em banco de dados mais simples e compacta.</li>
<li> Características avançadas do padrão SQL ANSI 2003 de windowing functions, common table expressions e consultas recursivas permitem a elaboração de relatório complexos em uma única consulta.</li>
<li> Melhorias de performance em todos os aspectos. Destaque para otimização do tempo de restauração do banco e tempo de execução de consultas (<code>semi-join</code> e <code>anti-join</code>).</li>
</ul>
<p>O grupo de desenvolvedores do PostgreSQL visa a cada versão tornar a administração e desenvolvimento nesse banco de dados mais fácil e produtivo, sem deixar de lado as características de robustez e performance que consagraram o SGBD livre mais avançado do mundo.</p>
<p>Confira a lista completa de <a rel="nofollow" target="_blank" href="http://www.dextra.com.br/servicos/treinamento/pg/postgres.htm">cursos</a> e <a rel="nofollow" target="_blank" href="http://www.dextra.com.br/postgres/">consultoria</a> PostgreSQL oferecida pela Dextra.</p>
<img src="http://feeds.feedburner.com/~r/dextra-bd/~4/EEe2q4BNzZY" height="1" width="1" alt=""/>]]></content:encoded>
      </item>
      <item>
         <title>Devemos deixar de usar máscaras nos campos de senha?</title>
         <link>http://blogs.dextra.com.br/wblog/2009/devemos-deixar-de-usar-mascaras-nos-campos-de-senha/</link>
         <description>&lt;p&gt;&lt;img class=&quot;alignnone size-full wp-image-29&quot; title=&quot;Captura de tela&quot; src=&quot;http://blogs.dextra.com.br/wp-content/uploads/2009/06/captura_de_tela.png&quot; alt=&quot;Captura de tela&quot; width=&quot;357&quot; height=&quot;60&quot;/&gt;&lt;/p&gt;
&lt;p&gt;Em seu &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.useit.com/alertbox/passwords.html&quot;&gt;artigo desta semana&lt;/a&gt;, Jakob Nielsen – um dos mais conceituados profissionais da Usabilidade – propõe que paremos de utilizar máscaras em campos de senha.&lt;/p&gt;
&lt;p&gt;Para ele, as máscaras de senha não aumentariam a segurança, visto que&amp;#8230;&lt;/p&gt;</description>
         <guid isPermaLink="false">http://blogs.dextra.com.br/?p=48</guid>
         <pubDate>Mon, 29 Jun 2009 19:43:09 +0000</pubDate>
         <content:encoded/>
         <category>WBlog</category>
      </item>
      <item>
         <title>Auditoria em banco de dados com Hibernate Envers</title>
         <link>http://feedproxy.google.com/~r/dextra-apalavradoarquiteto/~3/d-USHjT6go4/</link>
         <description>&lt;p&gt;Durante o desenvolvimento de aplicações corporativas em geral, nos deparamos sempre com requisitos de registro de histórico ou auditoria em banco de dados. Para isso podemos utilizar a ferramenta &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.jboss.org/envers/&quot;&gt;Hibernate Envers&lt;/a&gt; que foi iniciado como um projeto do JBoss&amp;#8230;&lt;/p&gt;</description>
         <guid isPermaLink="false">http://blogs.dextra.com.br/?p=26</guid>
         <pubDate>Fri, 19 Jun 2009 20:13:30 +0000</pubDate>
         <content:encoded/>
         <category>A palavra do Arquiteto</category>
      </item>
      <item>
         <title>Segurança de Dados</title>
         <link>http://feedproxy.google.com/~r/dextra-apalavradoarquiteto/~3/jbMOsoIBP-w/</link>
         <description>&lt;p&gt;&lt;img class=&quot;size-medium wp-image-48 aligncenter&quot; title=&quot;seguran&amp;#xe7;a de dados&quot; src=&quot;http://blogs.dextra.com.br/wp-content/uploads/2009/06/data_security-600x450-300x225.jpg&quot; alt=&quot;seguran&amp;#xe7;a de dados&quot; width=&quot;179&quot; height=&quot;133&quot;/&gt;&lt;/p&gt;
&lt;p&gt;A segurança de dados é um assunto que vem se tornando cada vez mais relevante no desenvolvimento de aplicações corporativas. Em geral, podemos proteger com relativa facilidade as funcionalidades de nossos sistemas, atribuindo permissões de acesso aos usuários e&amp;#8230;&lt;/p&gt;</description>
         <guid isPermaLink="false">http://blogs.dextra.com.br/?p=9</guid>
         <pubDate>Mon, 01 Jun 2009 18:39:25 +0000</pubDate>
         <content:encoded/>
         <category>A palavra do Arquiteto</category>
      </item>
      <item>
         <title>Técnicas para criação e manutenção de arquivos css em um ambiente de desenvolvimento coletivo</title>
         <link>http://blogs.dextra.com.br/wblog/2009/tecnicas-para-criacao-e-manutencao-de-arquivos-css-em-um-ambiente-de-desenvolvimento-coletivo/</link>
         <description>&lt;p&gt;Escrever e manter arquivos de formatação css só parece simples no  início. Conforme o projeto vai crescendo, novas solicitações de alterações são sugeridas pelo cliente. O tempo sempre exíguo muitas  vezes leva a soluções mais rápidas mas, quase sempre conceitualmente&amp;#8230;&lt;/p&gt;</description>
         <guid isPermaLink="false">http://blogs.dextra.com.br/?p=46</guid>
         <pubDate>Mon, 25 May 2009 15:42:29 +0000</pubDate>
         <content:encoded/>
         <category>WBlog</category>
      </item>
      <item>
         <title>Replicação PostgreSQL Warm Standby</title>
         <link>http://feedproxy.google.com/~r/dextra-bd/~3/MLHX-9HK5OQ/</link>
         <description>&lt;p&gt;O &lt;strong&gt;Sistema Gerenciador de Banco de Dados&lt;/strong&gt; (SGBD)  PostgreSQL possui vários recursos para replicação de dados, método essencial para promover a alta disponibilidade de sistemas. Neste artigo será abordada a técnica de replicação &lt;em&gt;&lt;strong&gt;Warm Standby&lt;/strong&gt;&lt;/em&gt;, que é realizada através do&amp;#8230;&lt;/p&gt;</description>
         <guid isPermaLink="false">http://blogs.dextra.com.br/?p=39</guid>
         <pubDate>Fri, 15 May 2009 15:49:06 +0000</pubDate>
         <content:encoded><![CDATA[<p>O <strong>Sistema Gerenciador de Banco de Dados</strong> (SGBD)  PostgreSQL possui vários recursos para replicação de dados, método essencial para promover a alta disponibilidade de sistemas. Neste artigo será abordada a técnica de replicação <em><strong>Warm Standby</strong></em>, que é realizada através do arquivamento dos logs de transação (<em>log shipping</em>).</p>
<p><strong>Os benefícios dessa replicação são muitos</strong>, fato que levou o grupo de desenvolvedores do PostgreSQL a se dedicar na criação e aperfeiçoamento de suas funcionalidades, o que antes ocorria com a ferramenta de replicação Slony-l. Como resultado dessa dedicação pode-se esperar o aumento constante do uso do <em>Warm Standby</em> para prover alta disponibilidade no PostgreSQL.</p>
<p>A partir da versão 8.2 do PostgreSQL, foi incorporada uma contrib chamada <code><strong>pg_standby</strong></code>. Este utilitário é responsável pelo gerenciamento da réplica que permanecerá em constante restauração dos logs de transação recebidos pelo servidor de produção até o momento da falha (<em>crash</em>) do mesmo, ocorrendo então o <em>failover.</em><br />
Com o <code>pg_standby</code> é possível uma replicação consistente sem ocasionar relevantes impactos à performance do sistema. Esta relação desempenho e consistência é um desafio para as soluções de replicação de banco de dados, sendo essa característica o maior benefício da replicação <em>Warm Standby</em>. Mas as vantagens não param por aí, o <code>pg_standby</code> permite também a recuperação imediata do servidor <em>Standby</em>, tornando-o disponível para acesso segundos após o <em>crash</em> do servidor de produção. Configuração de limpeza dos <em>logs</em> já restaurados ou armazenamento dos mesmos para <em>backup</em> e restauração PITR (<em>Point in Time Recovery</em>) também oferecem grande vantagem.</p>
<p>Para melhor compreender as vantagens do <em>Warm Standby</em>, basta analisar o funcionamento interno do PostgreSQL em relação a utilização dos logs de  transação.<br />
SGDBs avançados utilizam intensamente a memória principal para obter desempenho no gerenciamento dos dados. Por outro lado, dados em memória são perdidos na ocasião de uma falha inesperada no servidor. Surge então, a necessidade de um armazenamento intermediário no próprio disco, porém com uma característica que permita o acesso rápido na leitura e escrita. Para suprir essa necessidade são utilizados os logs transacionais, que possuem estrutura seqüencial para facilitar o acesso ao disco. No PostgreSQL esses logs são denominados <strong>WAL</strong> (<em>Write Ahead Logs</em>), estão presentes no diretório <code><strong>$PGDATA/pg_xlog</strong></code> e possuem por padrão 16MB (Ver figura 1). Em um intervalo de tempo configurado ou através de comando SQL, as transações que sofreram COMMIT são transferidas do WAL para o arquivo de dados e os logs são reciclados, essa operação é conhecida como <em><strong>CHECKPOINT</strong></em>.</p>
<p><img class="alignnone size-full wp-image-38" title="diret&#xf3;rio Wall" src="http://blogs.dextra.com.br/wp-content/uploads/2009/05/diretorio_wal.jpg" alt="diret&#xf3;rio Wall" width="426" height="291"/><br />
Figura 1 – Diretório do WAL</p>
<p>De tempos em tempos, as transações em memória são gravadas no WAL. As que sofreram COMMIT em memória podem ser gravadas de forma síncrona nos logs. A partir do momento que as transações estão nos logs, elas já podem ser recuperadas em caso de crash no banco de dados. Mas, e as transações que não sofreram COMMIT antes do crash? Foram perdidas, pois estavam totalmente em memória ou desfeitas se parcialmente gravadas no WAL. Observando a figura 2, pode-se entender o que acontece com as transações, nos seus possíveis estados, em caso de crash no banco de dados:</p>
<p><img class="alignnone size-full wp-image-60" title="redo transacoes" src="http://blogs.dextra.com.br/wp-content/uploads/2009/05/redo_transacoes.jpg" alt="redo transacoes" width="523" height="397"/><br />
Figura 2 – Gerenciamento de transações</p>
<p>O PostgreSQL utiliza um método conhecido como <strong>REDO</strong> para recuperar transações presentes no WAL. O REDO consiste em refazer toda a transação através das informações contidas no WAL. Sendo assim, em caso de falha, a transação TR1 da figura acima, estaria no arquivo de dados após o <em>CHECKPOINT</em>, portanto não necessitaria de recuperação. A TR2 e a TR3 estariam completamente no WAL, sendo necessário o REDO para refazê-las totalmente. A TR4 sofreria o <em><strong>ROLLBACK</strong></em> do sistema e para TR5 nada precisaria ser feito, pois foi eliminada na memória.</p>
<p>Mas e a replicação, como acontece? Com a cópia base do banco principal no servidor <em>Standby</em>, após o <em>CHECKPOINT</em> e antes da reciclagem, os arquivos WAL podem ser transferidos para um diretório do servidor <em>Standby</em>. O <code>pg_standby</code> é responsável pela aplicação dos <em>logs</em> no arquivo de dados do servidor <em>Standby</em>, aguardar o sinal para finalizar a restauração e disponibilizar o acesso imediato ao banco recuperado.</p>
<p>Reforçando tecnicamente as vantagens, o arquivamento do WAL ocorre em paralelo e de forma assíncrona, portanto não interfere no desempenho do banco de dados. A constante restauração do servidor <em>Standby</em>, permite o início imediato do mesmo após o crash do servidor principal. Os <em>logs</em> podem permanecer para <em>backup</em>, tanto no servidor principal, quanto no servidor <em>Standby</em> ou podem ser eliminados após a restauração. Todo o processo de sincronização entre memória e WAL, WAL e arquivo de dados, arquivamento, transferência e restauração dos <em>logs</em> podem ser configurados baseados no ambiente em que está inserido. Esta técnica pode ser combinada com técnicas de identificação de indisponibilidade do servidor, podendo todo o processo ser automatizado ou monitorado.</p>
<p>Melhorias para essa técnica de replicação são esperadas para a versão 8.5 do PostgreSQL. Dentre elas destacam-se a implementação da replicação síncrona, conhecida como <strong>Hot Standby</strong><em>, o arquivamento de transações que ainda estão em memória e a disponibilização do servidor <em>Standby</em> para leitura.</em></p>
<p><em>Concluindo, esta é uma técnica de replicação que pode ser ideal para vários ambientes, porém existem várias técnicas para implementação de alta disponibilidade em ambientes críticos. A Dextra possui grande experiência na implementação de <strong>alta disponibilidade no PostgreSQL</strong>, disponibilizando esse conhecimento no <a rel="nofollow" target="_blank" href="http://www.dextra.com.br/servicos/treinamento/pg/postgres-alta-disponibilidade.htm"><strong>treinamento de Alta disponibilidade</strong></a>, onde o aluno será habilitado a configurar alta disponibilidade através do PostgreSQL <em>Warm Standby</em> e ferramentas como <strong>SLony-I</strong>, <strong>Pgpool</strong>, entre outras.</em></p>
<img src="http://feeds.feedburner.com/~r/dextra-bd/~4/MLHX-9HK5OQ" height="1" width="1" alt=""/>]]></content:encoded>
      </item>
      <item>
         <title>Dextra alcança nível “F” de maturidade do MPS.Br</title>
         <link>http://feedproxy.google.com/~r/dextra-corporativo/~3/Ewwdzk2_q-I/</link>
         <description>&lt;p&gt;Caros leitores,&lt;/p&gt;
&lt;p&gt;É com grande satisfação que informamos que a Dextra Sistemas obteve sucesso na avaliação do &lt;strong&gt;nível F&lt;/strong&gt; de maturidade do &lt;strong&gt;MPS.BR&lt;/strong&gt; (Melhoria de Processo de Software Brasileiro).&lt;/p&gt;
&lt;p&gt;Em termos práticos, isso significa um avanço ainda maior na qualidade&amp;#8230;&lt;/p&gt;</description>
         <guid isPermaLink="false">http://blogs.dextra.com.br/?p=56</guid>
         <pubDate>Mon, 04 May 2009 18:45:24 +0000</pubDate>
         <content:encoded/>
         <category>Blog Corporativo</category>
      </item>
      <item>
         <title>Bem-vindos ao Blog Corporativo da Dextra Sistemas!</title>
         <link>http://feedproxy.google.com/~r/dextra-corporativo/~3/uImJ_AAGD_k/</link>
         <description>&lt;p style=&quot;text-align:left;&quot;&gt;Caros leitores,&lt;/p&gt;
&lt;p style=&quot;text-align:left;&quot;&gt;É com um imenso prazer que a &lt;strong&gt;Dextra Sistemas&lt;/strong&gt; inaugura seu Blog Corporativo, através deste canal de comunicação direrta com o mercado, iremos detalhar nossos serviços de &lt;strong&gt;fábrica de software&lt;/strong&gt;, &lt;strong&gt;consultoria&lt;/strong&gt; e &lt;strong&gt;treinamentos&lt;/strong&gt;, divulgar&amp;#8230;&lt;/p&gt;</description>
         <guid isPermaLink="false">http://blogs.dextra.com.br/?p=54</guid>
         <pubDate>Mon, 04 May 2009 08:15:44 +0000</pubDate>
         <content:encoded/>
         <category>Blog Corporativo</category>
      </item>
      <item>
         <title>Funcionalidades do PostgreSQL versão 8.4</title>
         <link>http://feedproxy.google.com/~r/dextra-bd/~3/ih8FKQsqsIs/</link>
         <description>&lt;p&gt;Olá, pessoal!&lt;/p&gt;
&lt;p&gt;Como o intuito de disseminar conhecimento, a Dextra Sistemas lançou este espaço para que nós, Administradores de Banco de Dados, possamos compartilhar nossas experiências diárias sobre o tema.&lt;/p&gt;
&lt;p&gt;Neste primeiro &lt;em&gt;post&lt;/em&gt; falaremos sobre o PostgreSQL, apresentando de forma&amp;#8230;&lt;/p&gt;</description>
         <guid isPermaLink="false">http://blogs.dextra.com.br/?p=41</guid>
         <pubDate>Thu, 30 Apr 2009 15:50:12 +0000</pubDate>
         <content:encoded><![CDATA[<p>Olá, pessoal!</p>
<p>Como o intuito de disseminar conhecimento, a Dextra Sistemas lançou este espaço para que nós, Administradores de Banco de Dados, possamos compartilhar nossas experiências diárias sobre o tema.</p>
<p>Neste primeiro <em>post</em> falaremos sobre o PostgreSQL, apresentando de forma resumida, duas funcionalidades que estarão disponíveis na versão 8.4, com lançamento previsto para maio ou junho deste ano. Uma versão beta da versão 8.4 já está disponível no site <a rel="nofollow" target="_blank" href="http://www.postgresql.org">www.postgresql.org</a>.</p>
<p>Um problema recorrente que os administradores de bancos de dados encontram  é em relação à configuração da codificação (conhecida como <em>charset</em> ou <em>encoding</em>) e localização (conhecida como <em>locales</em>) em aplicações de ambientes que possuem regras heterogêneas de linguagens e países distintos. Localização são regras que definem parâmetros de ordenação, classificação e agrupamento da informação de acordo com a localidade e a linguagem de cada região.</p>
<p>Em aplicações onde se tenha o requisito de suporte a múltiplas regras de localidade, precisamos que o servidor de banco de dados possua suporte, e a boa notícia é que o PostgreSQL, a partir da versão 8.4 terá esse suporte. Na nova versão, o PostgreSQL se desprende da codificação e da localização do sistema operacional e permite que em um mesmo cluster seja possível trabalhar com distintas codificações e localizações.</p>
<p>Após uma contextualização e a importância de se possuir uma flexibilidade e adaptação a qualquer conjunto de regras (<em>locales</em>), é apresentado como implementar esta funcionalidade no PostgreSQL.</p>
<p>Primeiro é necessário realizar a conexão a um banco de dados, e em seguida executar o comando <em>create database</em>.</p>
<p>A conexão com o PostgreSQL pode ser realizada a partir da seguinte linha:</p>
<p><code>psql postgres -U postgres</code></p>
<p>O próximo passo é a criação do banco de dados na codificação e localização desejada.</p>
<p><code>CREATE DATABASE dextra ENCODING='Latin1' COLLATE='pt_BR' CTYPE='pt_BR' TEMPLATE=template0;</code></p>
<p>Um detalhe é importante: Ao criar um banco de dados e especificar um <em>locale</em> diferente do padrão do <em>cluster</em> é necessário usar o template0 como <em>template</em>.</p>
<p>Uma forma de visualizar o banco, sua respectiva codificação e localização é:<br />
<code><br />
SELECT datname,pg_encoding_to_char(encoding),datcollate,datctype FROM pg_database;<br />
</code><br />
Um outro problema enfrentado pelos administradores de banco de dados é o momento de realizar um processo de <em>restore</em>, quando este é relativamente grande. Como uma solução de minimizar este problema, a partir da versão 8.4 será possível paralelizar o processo de restauração. Isso poderá ser feito através do parâmetro <em>-m (multi-thread)</em> do utilitário <code>pg_restore</code>.</p>
<img src="http://feeds.feedburner.com/~r/dextra-bd/~4/ih8FKQsqsIs" height="1" width="1" alt=""/>]]></content:encoded>
      </item>
      <item>
         <title>Apresentação – WBlog</title>
         <link>http://blogs.dextra.com.br/wblog/2009/apresentacao-wblog/</link>
         <description>&lt;p&gt;A partir da proposta da Dextra de criar este portal de Blogs, estreamos agora o &lt;strong&gt;WBlog&lt;/strong&gt;, com a proposta de discutir desenvolvimento web, web design, padrões web, usabilidade&amp;#8230; Traremos tópicos principalmente de tecnologias como HTML, CSS, JavaScript, AJAX, e experiências&amp;#8230;&lt;/p&gt;</description>
         <guid isPermaLink="false">http://blogs.dextra.com.br/?p=44</guid>
         <pubDate>Wed, 29 Apr 2009 19:41:42 +0000</pubDate>
         <content:encoded/>
         <category>WBlog</category>
      </item>
      <item>
         <title>Software Bem Testado</title>
         <link>http://feedproxy.google.com/~r/dextra-apalavradoarquiteto/~3/-MDLi1UltRk/</link>
         <description>&lt;p&gt;Muito tem sido escrito sobre testes automáticos e testabilidade de  software nos dias atuais. O rápido avanço tecnológico tem facilitado o  desenvolvimento de testes unitários, de integração e funcionais. No  entanto, o uso efetivo de testes automatizados não tem se&amp;#8230;&lt;/p&gt;</description>
         <guid isPermaLink="false">http://blogs.dextra.com.br/?p=7</guid>
         <pubDate>Mon, 27 Apr 2009 10:36:30 +0000</pubDate>
         <content:encoded/>
         <category>A palavra do Arquiteto</category>
      </item>
   </channel>
</rss>
<!-- fe2.yql.bf1.yahoo.com compressed/chunked Thu Oct  1 23:09:37 UTC 2015 -->
