<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-7763168801418010838</id><updated>2011-09-10T10:28:50.385-03:00</updated><category term='linux'/><category term='memória'/><category term='outofmemory'/><category term='postgresql'/><category term='java'/><category term='jetty'/><category term='php'/><category term='apple'/><category term='macbook'/><category term='Asterisk'/><category term='nosql'/><category term='banco de dados'/><category term='programação'/><category term='sed'/><category term='replace'/><category term='visualvm'/><title type='text'>Blog de Nivaldo Júnior</title><subtitle type='html'>Liberdade é tudo! :)</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://nivaldomjunior.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7763168801418010838/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://nivaldomjunior.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Nivaldo Montenegro Júnior</name><uri>http://www.blogger.com/profile/15963212778452328659</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_AC1VTr1jYCs/Swsr2fHftII/AAAAAAAACS0/LPCspCMpqYI/S220/DSC01579.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>10</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-7763168801418010838.post-4389331910341647283</id><published>2010-07-28T07:30:00.001-03:00</published><updated>2010-07-28T07:30:01.275-03:00</updated><title type='text'>Cassandra + PHP</title><content type='html'>&lt;p&gt;No post anterior eu expliquei sobre o funcionamento do Cassandra. Agora vamos colocar a mão na massa e vamos configurar o nosso servidor Debian para criar aplicações em PHP que interajam com o Cassandra.&lt;/p&gt;&lt;p&gt;O PHP precisa de uma biblioteca chamada Thrift para se comu&lt;/p&gt;&lt;p&gt;nicar com o Cassandra. Temos duas formas de trabalhar com ela, a primeira é usando a biblioteca dentro do diretório da nossa aplicação e a segunda é compilar um módulo nativo para o PHP. O módulo nativo proporciona muito mais velocidade. Vamos mostrar abaixo como configurar as duas formas.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;1- Configuração do servidor&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Passos para instalar o Thrift no servidor sem o módulo nativo do PHP:&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:'courier new', courier;"&gt;- apt-get install libboost-dev automake libtool flex bison pkg-config g++&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:'courier new', courier;"&gt;- wget http://ftp.unicamp.br/pub/apache/incubator/thrift/0.2.0-incubating/thrift-0.2.0-incubating.tar.gz&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:'courier new', courier;"&gt;- tar -xzvf thrift-0.2.0-incubating.tar.gz&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:'courier new', courier;"&gt;- cd thrift-0.2.0&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:'courier new', courier;"&gt;- ./configure&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:'courier new', courier;"&gt;- make&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:'courier new', courier;"&gt;- ./compiler/cpp/thrift -gen php ../PATH-TO-CASSANDRA/interface/cassandra.thrift&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:'courier new', courier;"&gt;- mkdir -p /usr/share/php5/Thrift&lt;/span&gt;&lt;span style="font-family:'courier new', courier;"&gt;- cp -R gen-php/ /usr/share/php5/Thrift/packages/&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:'courier new', courier;"&gt;- cp -R lib/php/src/* /usr/share/5php/Thrift/&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;Passos para instalar o módulo nativo do PHP:&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:'courier new', courier;"&gt;&lt;span&gt;- cd PATH-TO-THRIFT/lib/php/src/ext/thrift_protocol&lt;br /&gt;- apt-get install php5-dev&lt;br /&gt;- phpize&lt;br /&gt;- ./configure --enable-thrift_protocol&lt;br /&gt;- make&lt;br /&gt;&lt;/span&gt;- cp modules/thrift_protocol.so /usr/lib/php5/20060613/&lt;/span&gt;&lt;br /&gt;(A pasta lib do PHP vai depender da versão instalada no seu servidor)&lt;span style="font-family:'courier new', courier;"&gt;- vi /etc/php5/cli/conf.d/thrift_protocol.ini&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:'courier new', courier;"&gt;extension=thrift_protocol.so&lt;/span&gt;&lt;br /&gt;- Verificar instalação:&lt;br /&gt;&lt;span style="font-family:'courier new', courier;"&gt;php -i | grep -v "PWD" | grep "thrift_protocol"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:'courier new', courier;"&gt;- /etc/init.d/apache2 restart &lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:'courier new', courier;"&gt;&lt;strong&gt;&lt;span style="font-family:Helvetica, Arial, sans-serif;"&gt;&lt;strong&gt;2- Inserindo dados no Cassandra com o PHP&lt;/strong&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Agora que já temos o servidor configurado e pronto para funcionar, vamos fazer alguns testes inserindo dados no cassandra. Vamos usar como base o exemplo do post anterior.&lt;/p&gt;&lt;p&gt;Re-lembrando os dados:&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:'courier new', courier;"&gt;ColumnFamily: Usuarios&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:'courier new', courier;"&gt;['junior']['login'] = ['junior']&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:'courier new', courier;"&gt;['junior']['nome'] = ['Nivaldo']&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:'courier new', courier;"&gt;['junior']['sobrenome'] = ['Montenegro']&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:'courier new', courier;"&gt;&lt;span&gt;['junior']['email'] = ['&lt;a class="smarterwiki-linkify" style="text-decoration: none; color: #2288bb;" href="mailto:nivaldomjunior@gmail.com"&gt;nivaldomjunior@gmail.com&lt;/a&gt;']&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:'courier new', courier;"&gt;['usuario2']['login'] = ['usuario2']&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:'courier new', courier;"&gt;['usuario2']['nome'] = ['Fulano']&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:'courier new', courier;"&gt;['usuario2']['sobrenome'] = ['de tal']&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:'courier new', courier;"&gt;&lt;span&gt;['usuario2']['email'] = ['&lt;a class="smarterwiki-linkify" style="text-decoration: none; color: #2288bb;" href="mailto:fulano@gmail.com"&gt;fulano@gmail.com&lt;/a&gt;']&lt;/span&gt;&lt;br /&gt;['usuario2']['fone'] = ['(83)1234-1234']&lt;/span&gt;&lt;span style=" ;font-family:Verdana, Geneva, sans-serif;color:#222222;"&gt; &lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:'courier new', courier;"&gt;SuperColumn: Agenda&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:'courier new', courier;"&gt;['junior']['amigo1']['nome'] = ['Amigo 1']&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:'courier new', courier;"&gt;['junior']['amigo1']['telefone'] = ['(88)1234-1234']&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:'courier new', courier;"&gt;['junior']['amigo2']['nome'] = ['Amigo 2']&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:'courier new', courier;"&gt;['junior']['amigo2']['telefone'] = ['(99)4312-4312']&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:'courier new', courier;"&gt;['usuario2']['amigox']['nome'] = ['amigox']&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:'courier new', courier;"&gt;['usuario2']['amigox']['telefone'] = ['(77)9987-0987']&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:'courier new', courier;"&gt;['usuario2']['amigoy']['nome'] = ['Amigo y']&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:'courier new', courier;"&gt;&lt;span&gt;['usuario2']['amigoy']['email'] = ['&lt;a class="smarterwiki-linkify" style="text-decoration: none; color: #2288bb;" href="mailto:fulano@gmail.com"&gt;fulano@gmail.com&lt;/a&gt;']&lt;/span&gt;&lt;br /&gt;['usuario2']['amigoy']['fone'] = ['(83)1234-1234']&lt;/span&gt;&lt;/p&gt;&lt;p&gt;O código do arquivo php está em um arquivo de imagem, mas vou disponibilizar posteriormente o arquivo php para download.&lt;/p&gt;&lt;p&gt;Código do arquivo criar.php:&lt;/p&gt;&lt;p style="text-align: center;"&gt;&lt;img src="http://lh3.ggpht.com/_AC1VTr1jYCs/TE8ijHmjneI/AAAAAAAACnM/JaT2FMbO02o/Captura%20de%20tela%202010-07-27%20%C3%A0s%2015.10.11.png" alt="" width="708" height="905" /&gt;&lt;/p&gt;&lt;p&gt;Clique aqui para baixar o arquivo criar.php.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;3- Consultando dados no Cassandra&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;As consultas são realizadas em cima dos índices, ou seja, não dá para consultarmos diretamente os valores das chaves como estamos acostumados a fazer em um banco de dados SQL.&lt;/p&gt;&lt;p&gt;Por exemplo, vamos consulta os dados da Agenda do usuário junior:&lt;/p&gt;&lt;p style="text-align: center;"&gt;&lt;img src="http://lh5.ggpht.com/_AC1VTr1jYCs/TE8ijVNo83I/AAAAAAAACnQ/zHYoDQXxuhg/Captura%20de%20tela%202010-07-27%20%C3%A0s%2014.56.40.png" alt="" width="722" height="379" /&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;4- Mais informações&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Bom, este foi um exemplo rápido sobre como podemos usar o Cassandra com PHP. Espero que sirva como base para que você inicie no desenvolvimento com PHP e Cassandra.&lt;/p&gt;&lt;p&gt;Alguns links de referência:&lt;/p&gt;&lt;p&gt;- &lt;a href="https://wiki.fourkitchens.com/display/PF/Using+Cassandra+with+PHP" target="_blank"&gt;Using Cassandra with PHP&lt;/a&gt;&lt;/p&gt;&lt;p&gt;- &lt;a href="http://wiki.apache.org/cassandra/ThriftExamples" target="_blank"&gt;ThriftExamples&lt;/a&gt;&lt;/p&gt;&lt;p&gt;- &lt;a href="http://cassandra.apache.org/" target="_blank"&gt;Site do projeto Cassandra&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Até a próxima! :)&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7763168801418010838-4389331910341647283?l=nivaldomjunior.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nivaldomjunior.blogspot.com/feeds/4389331910341647283/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://nivaldomjunior.blogspot.com/2010/07/cassandra-php.html#comment-form' title='4 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7763168801418010838/posts/default/4389331910341647283'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7763168801418010838/posts/default/4389331910341647283'/><link rel='alternate' type='text/html' href='http://nivaldomjunior.blogspot.com/2010/07/cassandra-php.html' title='Cassandra + PHP'/><author><name>Nivaldo Montenegro Júnior</name><uri>http://www.blogger.com/profile/15963212778452328659</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_AC1VTr1jYCs/Swsr2fHftII/AAAAAAAACS0/LPCspCMpqYI/S220/DSC01579.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh3.ggpht.com/_AC1VTr1jYCs/TE8ijHmjneI/AAAAAAAACnM/JaT2FMbO02o/s72-c/Captura%20de%20tela%202010-07-27%20%C3%A0s%2015.10.11.png' height='72' width='72'/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7763168801418010838.post-3053825564682177741</id><published>2010-07-23T14:50:00.001-03:00</published><updated>2010-07-27T10:25:19.218-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='nosql'/><category scheme='http://www.blogger.com/atom/ns#' term='banco de dados'/><category scheme='http://www.blogger.com/atom/ns#' term='php'/><title type='text'>Entendendo o banco de dados NoSQL Cassandra</title><content type='html'>&lt;p&gt;Por necessidade, resolvi realizar testes em bancos de dados NoSQL. Estava precisando de um banco de dados que comporte pelo menos &lt;span style="color: #ff0000;"&gt;&lt;strong&gt;1.5 milh&amp;otilde;es de registros por dia&lt;/strong&gt;&lt;/span&gt; e que forne&amp;ccedil;a uma forma r&amp;aacute;pida para realizar consultas.&lt;/p&gt;&lt;p&gt;Testei tr&amp;ecirc;s NoSQL: &lt;strong&gt;Cassandra, MongoDB e CouchDB&lt;/strong&gt;.&lt;/p&gt;&lt;p&gt;Criei uma pequena aplica&amp;ccedil;&amp;atilde;o em PHP para inserir 500 milh&amp;otilde;es de registros (exagerei n&amp;eacute;? Mas precisava ter certeza) e um PHP para listar a quantidade de registros. Percebi que ainda tem poucos tutoriais que mostram de forma clara como as coisas funcionam e por isso resolvi escrever alguns pequenos posts mostrando o caminho das pedras.&lt;/p&gt;&lt;p&gt;Resolvi ent&amp;atilde;o escrever alguns posts sobre banco de dados NoSQL com PHP.&lt;/p&gt;&lt;p&gt;Vamos come&amp;ccedil;ar falando sobre o Cassandra com PHP.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;1- Por onde come&amp;ccedil;ar?&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;A primeira coisa a fazer &amp;eacute; acessar o site do projeto &lt;a href="http://cassandra.apache.org" target="_blank"&gt;http://cassandra.apache.org&lt;/a&gt; e fazer o download do Cassandra. A vers&amp;atilde;o que usei para os testes foi o Cassandra 0.6.3.&lt;/p&gt;&lt;p&gt;Passos para baixar e iniciar o Cassandra:&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 'courier new', courier; font-size: small;"&gt;- wget&amp;nbsp;http://ftp.unicamp.br/pub/apache/cassandra/0.6.3/apache-cassandra-0.6.3-bin.tar.gz&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: 'courier new', courier; font-size: small;"&gt;- tar -xzvf apache-cassandra-0.6.3&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: 'courier new', courier; font-size: small;"&gt;- cd apache-cassandra-0.6.3&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: 'courier new', courier; font-size: small;"&gt;- ./bin/cassandra -f&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Depois desses comandos o Cassandra estar&amp;aacute; funcionando com as configura&amp;ccedil;&amp;otilde;es padr&amp;atilde;o. Mas antes de come&amp;ccedil;armos a usar &amp;eacute; necess&amp;aacute;rio entenderemos a estrutura desse banco de dados NoSQL. Pra quem &amp;eacute; acostumar com bancos de dados tradicionais, &amp;eacute; necess&amp;aacute;rio um pouco de esfor&amp;ccedil;o para a quebra de parad&amp;iacute;gma.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;2- Conhecendo a estrutura do Cassandra&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;O Cassandra &amp;eacute; um banco de dados NoSQL e armazena as informa&amp;ccedil;&amp;otilde;es no formato chave = valor, mas para quem est&amp;aacute; acostumado com bancos de dados tradicionais, tabelas, joins, normaliza&amp;ccedil;&amp;atilde;o, etc., &amp;eacute; dif&amp;iacute;cil colocar na cabe&amp;ccedil;a que tudo o que voc&amp;ecirc; aprendeu a vida toda foi por &amp;aacute;gua abaixo. :)&lt;/p&gt;&lt;p&gt;Li v&amp;aacute;rios artigos e tutoriais para entender o esquema de armazenamento e indexa&amp;ccedil;&amp;atilde;o do Cassandra. Um excelente ponto de partida &amp;eacute; este artigo:&amp;nbsp;&lt;a href="http://arin.me/blog/wtf-is-a-supercolumn-cassandra-data-model" target="_blank"&gt;WTF is a SuperColumn? An Intro to the Cassandra Data Model&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;Pra quem n&amp;atilde;o sabe o que significa WTF: What the fuck... ou seja, que porra &amp;eacute; uma supercolumn?!?! :)&lt;/p&gt;&lt;p&gt;Com este artigo d&amp;aacute; para entender bem o funcionamento do esquema de armazenamento e indexa&amp;ccedil;&amp;atilde;o, por isso, n&amp;atilde;o explicarei detalhadamente como funciona, apenas superficialmente atrav&amp;eacute;s de exemplo para complementar o artigo citado.&lt;/p&gt;&lt;p&gt;De forma bem simplificada:&lt;/p&gt;&lt;p&gt;&lt;strong&gt;- Column:&lt;/strong&gt; Armazena chave, valor e timestamp. Todos os dados s&amp;atilde;o armazenados em columns. A column n&amp;atilde;o precisa ser criada em arquivo de configura&amp;ccedil;&amp;atilde;o, basta inserir uma nova column com chave/valor que o banco de dados cria automaticamente. &lt;strong&gt;Column - ['id']['chave'] = ['valor']&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;- SuperColumn:&lt;/strong&gt; Armazena chave = chave/valor/timestamp. &amp;Eacute; como se fosse um conjunto de columns. A SuperColumn na verdade &amp;eacute; uma ColumnFamily do tipo Super. Possui duas chaves. &lt;strong&gt;SuperColumn - ['id']['chave1']['chave2'] = valor&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;- ColumnFamily:&lt;/strong&gt; &amp;Eacute; uma fam&amp;iacute;lia de colunas, ou seja, &amp;eacute; o agrupamento de v&amp;aacute;rias chave = valor. &amp;Eacute; necess&amp;aacute;rio criar a ColumnFamily dentro das configura&amp;ccedil;&amp;otilde;es do cassandra (storage-conf.xml). Ou seja, as Columns ficam armazenadas em uma ColumnFamily.&lt;/p&gt;&lt;p&gt;Exemplo:&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 'courier new', courier; font-size: small;"&gt;ColumnFamily: Usuarios&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 'courier new', courier; font-size: small;"&gt;['junior']['login'] = ['junior']&lt;br /&gt; &lt;/span&gt;&lt;span style="font-family: 'courier new', courier; font-size: small;"&gt;['junior']['nome'] = ['Nivaldo']&lt;br /&gt; &lt;/span&gt;&lt;span style="font-family: 'courier new', courier; font-size: small;"&gt;['junior']['sobrenome'] = ['Montenegro']&lt;br /&gt; &lt;/span&gt;&lt;span style="font-family: 'courier new', courier; font-size: small;"&gt;['junior']['email'] = ['nivaldomjunior@gmail.com']&lt;br /&gt; &lt;/span&gt;&lt;span style="font-family: 'courier new', courier; font-size: small;"&gt;['usuario2']['login'] = ['usuario2']&lt;br /&gt; &lt;/span&gt;&lt;span style="font-family: 'courier new', courier; font-size: small;"&gt;['usuario2']['nome'] = ['Fulano']&lt;br /&gt; &lt;/span&gt;&lt;span style="font-family: 'courier new', courier; font-size: small;"&gt;['usuario2']['sobrenome'] = ['de tal']&lt;br /&gt; &lt;/span&gt;&lt;span style="font-family: 'courier new', courier; font-size: small;"&gt;['usuario2']['email'] = ['fulano@gmail.com']&lt;br /&gt; ['usuario2']['fone'] = ['(83)1234-1234']&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 'courier new', courier; font-size: small;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 'courier new', courier; font-size: small;"&gt;Usuarios = { // ColumnFamily&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: 'courier new', courier; font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;junior: { &amp;nbsp; // Esta &amp;eacute; a chave da CF (id)&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: 'courier new', courier; font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// Dentro da CF podemos ter um n&amp;uacute;mero infinito de chave/valor&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: 'courier new', courier; font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;login: "junior",&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: 'courier new', courier; font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;nome: "Nivaldo",&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: 'courier new', courier; font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sobrenome: "Montenegro",&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: 'courier new', courier; font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;email: "phatduckk@example.com",&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: 'courier new', courier; font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;}, // Fim&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: 'courier new', courier; font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;usuario2: { &amp;nbsp; // Esta &amp;eacute; a chave para outra linha na CF (id)&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: 'courier new', courier; font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// Podemos inserir outro n&amp;uacute;mero infinito de chave/valor e n&amp;atilde;o precisa ter as mesmas chaves/valor que outras linhas da CF&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: 'courier new', courier; font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;login: "junior",&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: 'courier new', courier; font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;nome: "Nivaldo",&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: 'courier new', courier; font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sobrenome: "Montenegro",&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: 'courier new', courier; font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;email: "phatduckk@example.com",&lt;/span&gt;&amp;nbsp;&amp;nbsp;&lt;span style="font-family: 'courier new', courier;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; fone: "(83) 1234-1234"&lt;br /&gt; &lt;/span&gt;&lt;span style="font-family: 'courier new', courier; font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;},&lt;br /&gt; &lt;/span&gt;&lt;span style="font-family: 'courier new', courier; font-size: small;"&gt;}&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: Monaco, 'Liberation Mono', 'Lucida Console', monospace; font-size: 12px; white-space: pre;"&gt;&lt;strong&gt;- KeySpace:&lt;/strong&gt; &amp;Eacute; um conjunto de ColumnFamily. Analogamente, &amp;eacute; como se fosse um banco de dados criado dentro do cassandra. &amp;Eacute; necess&amp;aacute;rio realizar configura&amp;ccedil;&amp;otilde;es no arquivo storage-conf.xml para criar as KeySpaces e realizar um restart no Cassandra.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Evoluindo o exemplo dado para a ColumnFamily, podemos transformar a ColumnFamily em uma SuperColumn e termos dados mais organizados sobre os clientes.&lt;/p&gt;&lt;p&gt;Exemplo SuperColumn:&lt;/p&gt;&lt;p&gt;&lt;p&gt;Exemplo:&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 'courier new', courier; font-size: small;"&gt;SuperColumn: Agenda&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 'courier new', courier; font-size: small;"&gt;['junior']['amigo1']['nome'] = ['Amigo 1']&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: 'courier new', courier; font-size: small;"&gt;['junior']['amigo1']['telefone'] = ['(88)1234-1234']&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: 'courier new', courier; font-size: small;"&gt;['junior']['amigo2']['nome'] = ['Amigo 2']&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: 'courier new', courier; font-size: small;"&gt;['junior']['amigo2']['telefone'] = ['(99)4312-4312']&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: 'courier new', courier; font-size: small;"&gt;['usuario2']['amigox']['nome'] = ['amigox']&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: 'courier new', courier; font-size: small;"&gt;['usuario2']['amigox']['telefone'] = ['(77)9987-0987']&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: 'courier new', courier; font-size: small;"&gt;['usuario2']['amigoy']['nome'] = ['Amigo y']&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: 'courier new', courier; font-size: small;"&gt;['usuario2']['amigoy']['email'] = ['fulano@gmail.com']&lt;br /&gt;['usuario2']['amigoy']['fone'] = ['(83)1234-1234']&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 'courier new', courier; font-size: small;"&gt;Agenda = { // SuperColumn&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new', courier; font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;junior: { &amp;nbsp; // ColumnFamily&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;amigo1: { //Chave da ColumnFamily&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// Dentro da CF podemos ter um n&amp;uacute;mero infinito de chave/valor&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: 'courier new', courier; font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;nome: "Amigo 1",&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: 'courier new', courier; font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;telefone: "(88)1234-1234",&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} //Fim do amigo1&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;amigo2: { //Outra chave na ColumnFamily&amp;nbsp;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: 'courier new', courier; font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;nome: "Amigo 2",&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: 'courier new', courier; font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;telefone: "(99)4312-4312",&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} // Fim do amigo 2&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 'courier new', courier; font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;}, // Fim da CF junior&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new', courier; font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;usuario2: { &amp;nbsp; // Outra ColumnFamily&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;amigox: { //Chave da ColumnFamily&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new', courier; font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// Podemos inserir outro n&amp;uacute;mero infinito de chave/valor e n&amp;atilde;o precisa ter as mesmas chaves/valor que outras linhas da CF&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new', courier; font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;nome: "amigox",&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new', courier; font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;telefone: "(77)99870987",&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} //Fim amigox&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;amigoy: { //Outra CF&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new', courier; font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;nome: "Amigo Y",&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;fone: "(83)1234-1234"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new', courier; font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;email: "fulano@gmail.com",&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: 'courier new', courier;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} //Fim amigoy&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: 'courier new', courier; font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;}, //Fim da CF usuario2&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: 'courier new', courier; font-size: small;"&gt;}&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Ou seja, temos os seguintes n&amp;iacute;veis no Cassandra:&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 'courier new', courier; font-size: small;"&gt;KeySpaces&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 'courier new', courier; font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;ColumnFamily&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new', courier; font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Columns&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new', courier; font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;SuperColumn&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new', courier; font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ColumnFamily&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new', courier; font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Columns&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;Um fato importante &amp;eacute; que as buscas necessariamente precisam ser realizadas usando os &amp;iacute;ndices, ou seja, as chaves das ColumnFamilys. N&amp;atilde;o tem como fazermos as consultas usando os valores finais das chaves diretamente no banco de dados. Para isso &amp;eacute; necess&amp;aacute;rio buscarmos todos os dados e realizarmos a consulta usando a linguagem de programa&amp;ccedil;&amp;atilde;o. Por isso, &amp;eacute; extremamente importante criar &amp;iacute;ndices que realmente sejam utilizados e n&amp;atilde;o usar n&amp;uacute;meros sequencias como costumamos fazer nos campos id das tabelas em um banco de dados tradicional.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;3- Configurando o cassandra para atender o exemplo acima&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&amp;Eacute; necess&amp;aacute;rio configurar o Cassandra para criar as KeySpaces, ColumnFamilys e SuperColumns (ColumnFamily do tipo Super) que iremos precisar para armazenar os nossos dados. As configura&amp;ccedil;&amp;otilde;es s&amp;atilde;o relativamente simples, mas precisamos definir qual o tipo de ordena&amp;ccedil;&amp;atilde;o que faremos para cada ColumnFamily e SuperFamily, pois os dados s&amp;atilde;o armazenados e ordenados automaticamente de acordo com a configura&amp;ccedil;&amp;atilde;o criada para a ColumnFamily ou SuperColumn.&lt;/p&gt;&lt;p&gt;Exemplo de configura&amp;ccedil;&amp;atilde;o:&lt;/p&gt;&lt;p&gt;&lt;p&gt;&lt;span style="font-family: 'courier new', courier; font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;lt;Keyspace Name="Teste"&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new', courier; font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;!-- Defini&amp;ccedil;&amp;atilde;o da ColumnFamily --&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new', courier; font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;ColumnFamily CompareWith="UTF8Type" Name="Usuarios"/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new', courier; font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;!-- Defini&amp;ccedil;&amp;atilde;o da SuperColumn --&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new', courier; font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;ColumnFamily CompareWith="UTF8Type" Name="Agenda"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new', courier; font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;CompareSubcolumnsWith="UTF8Type" ColumnType="Super"/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new', courier; font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;lt;/Keyspace&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;O par&amp;acirc;metro CompareWith nas ColumnFamilys &amp;eacute; o que vai determinar a forma de ordena&amp;ccedil;&amp;atilde;o da ColumnFamily. O CompareWith no nosso exemplo vai ser usado para ordenar a chave da ColumnFamily, que no nosso exemplo tem dois valores: junior e usuario2. No artigo citado acima (&lt;a href="http://arin.me/blog/wtf-is-a-supercolumn-cassandra-data-model" target="_blank"&gt;esse link&lt;/a&gt;) tem um exemplo bem detalhado sobre a forma de ordena&amp;ccedil;&amp;atilde;o.&lt;/p&gt;&lt;p&gt;J&amp;aacute; nas SuperColumns, o par&amp;acirc;metro CompareWith ordena o nome da ColumnFamily, no nosso exemplo os valores junior e usuario2, e o par&amp;acirc;metro CompareSubColumnsWith ordena a chave da ColumnFamily, que no nosso exemplo tem os valores amigo1, amigo2, amigox e amigoy.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;4- Conclus&amp;atilde;o&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;O Cassandra &amp;eacute; um banco de dados NoSQL extremamente flex&amp;iacute;vel e poderoso, principalmente quando se pensa em escalabilidade, mas a organiza&amp;ccedil;&amp;atilde;o dos dados &amp;eacute; o que vai determinar o sucesso da utiliza&amp;ccedil;&amp;atilde;o desse tipo de banco de dados. &amp;Eacute; necess&amp;aacute;rio realizar um trabalho minucioso em cima dos &amp;iacute;ndices para que as buscas sejam realmente r&amp;aacute;pidas e eficientes, minimizando a filtragem de dados usando a linguagem de programa&amp;ccedil;&amp;atilde;o.&lt;/p&gt;&lt;p&gt;Espero que eu tenha esclarecido as suas d&amp;uacute;vidas e no pr&amp;oacute;ximo post vou falar um pouco sobre como utilizar o Cassandra com PHP em um servidor com Debian.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7763168801418010838-3053825564682177741?l=nivaldomjunior.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nivaldomjunior.blogspot.com/feeds/3053825564682177741/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://nivaldomjunior.blogspot.com/2010/07/entendendo-o-banco-de-dados-nosql.html#comment-form' title='1 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7763168801418010838/posts/default/3053825564682177741'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7763168801418010838/posts/default/3053825564682177741'/><link rel='alternate' type='text/html' href='http://nivaldomjunior.blogspot.com/2010/07/entendendo-o-banco-de-dados-nosql.html' title='Entendendo o banco de dados NoSQL Cassandra'/><author><name>Nivaldo Montenegro Júnior</name><uri>http://www.blogger.com/profile/15963212778452328659</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_AC1VTr1jYCs/Swsr2fHftII/AAAAAAAACS0/LPCspCMpqYI/S220/DSC01579.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7763168801418010838.post-2901905872759820290</id><published>2010-07-01T17:11:00.001-03:00</published><updated>2010-07-01T17:21:14.568-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Asterisk'/><title type='text'>Instalando e configurando o FOP2 para monitorar o seu Asterisk</title><content type='html'>Esses dias tava navegando em sites sobre Asterisk e vi o pessoal falando sobre o FOP 2 (Flash Operator Panel). Lembrei que tinha testado a primeira versão do FOP, mas não tinha gostado muito. Achei a interface um feinha.&lt;div&gt;Resolvi então testar o FOP 2 e gostei muito, compramos inclusive uma licença para monitorar mais de 15 ramais.&lt;/div&gt;&lt;div&gt;Estou usando no PABX da empresa monitorando todos os ramais, os dois E1s, os troncos SIP e IAX, as portas analógicas FXO (interface de celular), as filas de atendimento e as salas de conferência e estamos muito satisfeitos com o desempenho e funcionamento.&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;O procedimento de instalação e configuração é bem simples.&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;1- Faça o download do FOP 2 em&amp;nbsp;&lt;a href="http://www.fop2.com/download.php"&gt;http://www.fop2.com/download.php&lt;/a&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;2- Descompacte a versão que você baixou, no meu caso Debian Lenny&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;# cd /usr/src/&lt;/div&gt;&lt;div&gt;# tar -xzvf&amp;nbsp;fop2-2.11-debian-i386.tgz&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;3- Instale o FOP 2 executando make install:&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;# cd fop2/&lt;/div&gt;&lt;div&gt;# make install&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Este será o resultado do comando:&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;font class="Apple-style-span" color="#999999"&gt;&lt;br&gt;&lt;/font&gt;&lt;/div&gt;&lt;div&gt;&lt;font class="Apple-style-span" color="#999999"&gt;&lt;/font&gt;&lt;/div&gt;&lt;blockquote&gt;New configuration file /usr/local/fop2/fop2.cfg.new installed.&lt;/blockquote&gt;&lt;blockquote&gt;Original fop2.cfg preserved.&lt;/blockquote&gt;&lt;blockquote&gt;New configuration file /var/www/fop2/config.php.new installed.&lt;/blockquote&gt;&lt;blockquote&gt;Original config.php preserved.update-rc.d: warning: /etc/init.d/fop2 missing LSB information&lt;/blockquote&gt;&lt;blockquote&gt;update-rc.d: see &lt;http: wiki.debian.org="" lsbinitscripts=""&gt;&amp;nbsp;System startup links for /etc/init.d/fop2 already exist.Done!&lt;/http:&gt;&lt;/blockquote&gt;&lt;div&gt;&lt;font class="Apple-style-span" color="#999999"&gt;&lt;/font&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;font class="Apple-style-span" color="#999999"&gt;&lt;br&gt;&lt;/font&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;4- Edite o arquivo fop2.cfg para configurar o FOP2&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;# cd /usr/local/fop2/&lt;/div&gt;&lt;div&gt;# vi fop2.cfg&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;- Configure o manager através dos parâmetros:&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;; AMI definitions&lt;/div&gt;&lt;div&gt;manager_host=localhost&lt;/div&gt;&lt;div&gt;manager_port=5038&lt;/div&gt;&lt;div&gt;manager_user=admin&lt;/div&gt;&lt;div&gt;manager_secret=senha&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;- Configure os usuários que terão acesso ao FOP2 e defina um arquivo de botões&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;user=8195:1234:all&lt;/div&gt;&lt;div&gt;buttonfile=buttons.cfg&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;No meu caso, 8195 é também o nome do meu usuário SIP. Dessa forma eu poderei interagir com o FOP2 para executar comandos de discagem, transferência, etc e tudo será direcionado para o telefone IP da minha mesa.&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;- Comente a última linha do arquivo:&lt;/div&gt;&lt;div&gt;;#exec autoconfig-users-freepbx.sh&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;5- Crie um arquivo com as configurações dos seus ramais SIP, trunks, salas de conferência e filas (buttons.cfg, conforme definido no fop2.cfg):&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Exemplo de arquivo:&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;# vi buttons.cfg&lt;/div&gt;&lt;div&gt;&lt;div&gt;[SIP/8195]&lt;/div&gt;&lt;div&gt;type=extension&lt;/div&gt;&lt;div&gt;extension=8195&lt;/div&gt;&lt;div&gt;context=Ramais&lt;/div&gt;&lt;div&gt;label=Junior&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;[QUEUE/Fila-XYZ]&lt;/div&gt;&lt;div&gt;type=queue&lt;/div&gt;&lt;div&gt;label=SAC&lt;/div&gt;&lt;div&gt;extension=100&lt;/div&gt;&lt;div&gt;context=ramais&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;[DAHDI/1]&lt;/div&gt;&lt;div&gt;type=trunk&lt;/div&gt;&lt;div&gt;label=E1 da Embratel&lt;/div&gt;&lt;div&gt;channel=DAHDI/1&lt;/div&gt;&lt;div&gt;channel=DAHDI/2&lt;/div&gt;&lt;div&gt;channel=DAHDI/3&lt;/div&gt;&lt;div&gt;channel=DAHDI/4&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;[CONFERENCE/1000]&lt;/div&gt;&lt;div&gt;type=conference&lt;/div&gt;&lt;div&gt;label=Sala de conferencia&lt;/div&gt;&lt;div&gt;server=1&lt;/div&gt;&lt;div&gt;extension=8177&lt;/div&gt;&lt;div&gt;context=ramais&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;6- Após configurar os arquivos necessários, precisamos iniciar o serviço do FOP server para que o FOP2 funcione. Faça isso executando o comando:&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;# /etc/init.d/fop2 start&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;7- Acesse a URL http://IP_SERVIDOR/fop2 e utilize o usuário e senha criado no fop2.cfg para ter acesso aos recursos do FOP&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Caso você não esteja conseguindo acessar o FOP depois de digitar o login e senha, você pode iniciar o servidor manualmente usando o comando /usr/local/fop2_server e verificar qual a mensagem de erro que está sendo mostrada na inicialização do serviço.&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Usando as configurações do fop2.cfg, é possível definir grupos de acesso e associá-los aos usuários. Dessa forma você poderá montar paines de operadora diferentes de acordo com cada usuário que acessar.&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Para maiores informações sobre o FOP, é só consultar a documentação online dele no endereço:&amp;nbsp;&lt;a href="http://www.fop2.com/download.php"&gt;http://www.fop2.com/documentation.php&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Então é isso! :)&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Um breve tutorial de como instalar e configurar o FOP.&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7763168801418010838-2901905872759820290?l=nivaldomjunior.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nivaldomjunior.blogspot.com/feeds/2901905872759820290/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://nivaldomjunior.blogspot.com/2010/07/instalando-e-configurando-o-fop2-para.html#comment-form' title='3 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7763168801418010838/posts/default/2901905872759820290'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7763168801418010838/posts/default/2901905872759820290'/><link rel='alternate' type='text/html' href='http://nivaldomjunior.blogspot.com/2010/07/instalando-e-configurando-o-fop2-para.html' title='Instalando e configurando o FOP2 para monitorar o seu Asterisk'/><author><name>Nivaldo Montenegro Júnior</name><uri>http://www.blogger.com/profile/15963212778452328659</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_AC1VTr1jYCs/Swsr2fHftII/AAAAAAAACS0/LPCspCMpqYI/S220/DSC01579.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7763168801418010838.post-8021924669039685512</id><published>2009-12-05T09:38:00.015-03:00</published><updated>2009-12-07T08:24:38.754-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='banco de dados'/><category scheme='http://www.blogger.com/atom/ns#' term='postgresql'/><title type='text'>Otimizando a performance do seu banco de dados no PostgreSQL</title><content type='html'>&lt;div style="text-align: justify;"&gt;Quem trabalha com informática fatalmente vai ter que mexer com tudo. No início você trabalha somente com redes ou com desenvolvimento de software, mas atualmente as duas áreas estão cada vez mais integradas.&lt;/div&gt;&lt;div&gt;O desenvolvedor de software tem que conhecer cada vez mais de redes, segurança e protocolos de comunicação para desenvolver um software eficiente, que consuma poucos recursos, seja seguro e tenha qualidade. Já o administrador de redes, precisa conhecer o desenvolvimento de software para conseguir monitorar as aplicações que funcionam no seu servidor, verificar questões de segurança e em alguns momentos desenvolver scripts ou pequenos programas que auxiliem na administração da rede e dos servidores.&lt;/div&gt;&lt;div&gt;O novo desafio que peguei pela frente foi fazer a otimização de um servidor de banco de dados PostgreSQL.&lt;/div&gt;&lt;div&gt;A necessidade surgiu após fazer a análise do funcionamento do servidor durante um período de produção. A CPU do servidor estava trabalhando sempre acima de 75% e a memória sempre abaixo de 15%.&lt;/div&gt;&lt;div&gt;Algumas partes do sistema estavam extremamente lentas, principalmente a tela de consulta de log de transações realizadas e o detalhamento de cada transação.&lt;/div&gt;&lt;div&gt;Antes de iniciarmos a conversa sobre otimização, vamos a alguns números do Banco de Dados e do servidor em questão:&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Servidor:&lt;/b&gt; Dell PowerEdge Quad Xeon 2.33 Ghz, 4GB RAM, 1TB HD&lt;/li&gt;&lt;li&gt;&lt;b&gt;Quantidade de tabelas:&lt;/b&gt; 50&lt;/li&gt;&lt;li&gt;&lt;b&gt;Tamanho atual do banco:&lt;/b&gt; 5,3 GB&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;O banco de dados possui 4 principais tabelas que recebem inúmeros INSERTs por dia. A estimativa é que sejam inseridos no banco de dados todos os dias cerca de 1.000.000 de registros (Putz! Haja registro! Mas vamos em frente... vai dar certo! hehehe).&lt;/div&gt;&lt;/div&gt;&lt;div&gt;Lendo um pouco sobre o PostgreSQL e sobre Banco de Dados, cheguei à conclusão que para melhorar o desempenho era necessário:&lt;/div&gt;&lt;div&gt;&lt;ol&gt;&lt;li&gt;&lt;b&gt;Melhorar a estrutura de tabelas do banco de dados&lt;/b&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;Realizar algumas configurações no PostgreSQL&lt;/b&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;Programar manutenções diárias no banco de dados&lt;/b&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;div&gt;Antes de executar as modificações, realizei o acesso à página de logs do sistema (nessa página a consulta é realizada por data e em um dia de consulta o retorno é de aproximadamente 110.000 registros) e ao detalhamento de um dos logs. Resultado:&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Tempo para carregar página de logs:&lt;/b&gt; &lt;b&gt;&lt;span class="Apple-style-span"  style="color:#FF0000;"&gt;4,53 segundos&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;img src="http://lh6.ggpht.com/_AC1VTr1jYCs/SxzWBMJZPaI/AAAAAAAACYA/VwU6dw_tBcI/s1024/Captura%20de%20tela%202009-12-07%20%C3%A0s%2007.20.03.png" style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 800px; height: 232px;" border="0" alt="" /&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Tempo para carregar detalhamento:&lt;/b&gt; &lt;b&gt;&lt;span class="Apple-style-span"  style="color:#FF0000;"&gt;35,42 segundos&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;&lt;img src="http://lh4.ggpht.com/_AC1VTr1jYCs/SxzZ1S6CcmI/AAAAAAAACYM/ZIZEFClqDr0/s1024/Captura%20de%20tela%202009-12-07%20%C3%A0s%2007.20.51.png" style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 800px; height: 260px;" border="0" alt="" /&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;O primeiro passo é melhorar a estrutura do banco de dados através da criação de índices nos campos que são geralmente usados na clásula where do SQL.&lt;/div&gt;&lt;div&gt;Analisei as consultas e encontrei os principais campos em cada tabela. É importante observar que não adianta criar índices em todos os campos de todas as tabelas, se não a CPU do seu servidor vai para as alturas.&lt;/div&gt;&lt;div&gt;A análise da consulta pode ser feita usando o comando &lt;b&gt;EXPLAIN ANALYZE&lt;/b&gt;. Basta executar &lt;b&gt;EXPLAIN ANALYZE&lt;/b&gt; seguido do seu select que está lento e você vai ter um resumo do tempo consumido em cada parte da sua consulta e a partir daí você saberá quais os campos são necessários criar um índice.&lt;/div&gt;&lt;div&gt;Mas antes de melhorarmos os índices do nosso banco de dados, vamos fazer uma limpeza geral de registros que foram deletados mas que o banco de dados ainda não os removeu por completo, apenas marcou os registros como apagados. Fazemos isso através do comando &lt;b&gt;VACUUM FULL&lt;/b&gt;.&lt;/div&gt;&lt;div&gt;Este comando não pode ser executado frequentemente, já que ele dá um lock nas tabelas na hora que está fazendo a operação. É importante que você faça a manutenção do seu Banco de Dados para evitar o uso deste comando. Falarei sobre estas operações no meu próximo post.&lt;/div&gt;&lt;div&gt;O comando &lt;b&gt;VACUUM FULL&lt;/b&gt; demora um pouco para ser executado, dependendo do tamanho do seu banco de dados. No meu caso, demorou 103 segundos, ou seja, 1 min e 43 segundos.&lt;/div&gt;&lt;div&gt;Agora vamos criar os índices das tabelas. A criação dos índices é feita usando o comando &lt;b&gt;CREATE INDEX &lt;/b&gt;seguido do comando &lt;b&gt;ANALYZE&lt;/b&gt; tabela, exemplo:&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;CREATE INDEX log_chamada_id_idx1 on log_operacao_cti(log_chamada_id)&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;Onde log_chamada_id_idx1 é o nome do índice, log_operacao_cti é o nome da tabela e log_chamada_id é o campo da tabela que eu desejo criar um índice.&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;ANALYZE log_operacao_cti&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;Resultado da criação dos índices no meu banco de dados:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;img src="http://lh6.ggpht.com/_AC1VTr1jYCs/SxzZ1mJ7qKI/AAAAAAAACYU/CLB2KQi82kU/s1024/Captura%20de%20tela%202009-12-07%20%C3%A0s%2007.25.53.png" style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 800px; height: 255px;" border="0" alt="" /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Agora que temos índices criados nas nossas tabelas, vamos realizar um novo teste no sistema para ver como está o tempo de carregamento.&lt;/div&gt;&lt;div&gt;Resultado após as alterações:&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Tempo para carregar a página de logs:&lt;/b&gt; &lt;b&gt;&lt;span class="Apple-style-span"  style="color:#3333FF;"&gt;1,46 segundos&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;img src="http://lh4.ggpht.com/_AC1VTr1jYCs/SxzZ17PktBI/AAAAAAAACYY/eiLzUEOq-K0/s1024/Captura%20de%20tela%202009-12-07%20%C3%A0s%2007.26.25.png" style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 800px; height: 181px;" border="0" alt="" /&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Tempo para carregar o detalhamento:&lt;/b&gt; &lt;b&gt;&lt;span class="Apple-style-span"  style="color:#3333FF;"&gt;492 ms&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;img src="http://lh5.ggpht.com/_AC1VTr1jYCs/SxzZ16rFmfI/AAAAAAAACYc/2ct4rWV3Srs/s1024/Captura%20de%20tela%202009-12-07%20%C3%A0s%2007.26.49.png" style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 800px; height: 182px;" border="0" alt="" /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Percebeu a diferença? :)&lt;/div&gt;&lt;div&gt;O próximo passo é melhorar a configuração do servidor PostgreSQL para que ele consuma os recursos disponíveis no hardware de forma mais eficiente e programar manutenções no banco de dados para mantermos o banco sempre limpo e funcionando perfeitamente, mas isto é assunto para um próximo post.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7763168801418010838-8021924669039685512?l=nivaldomjunior.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nivaldomjunior.blogspot.com/feeds/8021924669039685512/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://nivaldomjunior.blogspot.com/2009/12/otimizando-performance-do-seu-banco-de.html#comment-form' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7763168801418010838/posts/default/8021924669039685512'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7763168801418010838/posts/default/8021924669039685512'/><link rel='alternate' type='text/html' href='http://nivaldomjunior.blogspot.com/2009/12/otimizando-performance-do-seu-banco-de.html' title='Otimizando a performance do seu banco de dados no PostgreSQL'/><author><name>Nivaldo Montenegro Júnior</name><uri>http://www.blogger.com/profile/15963212778452328659</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_AC1VTr1jYCs/Swsr2fHftII/AAAAAAAACS0/LPCspCMpqYI/S220/DSC01579.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh6.ggpht.com/_AC1VTr1jYCs/SxzWBMJZPaI/AAAAAAAACYA/VwU6dw_tBcI/s72-c/Captura%20de%20tela%202009-12-07%20%C3%A0s%2007.20.03.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7763168801418010838.post-4426429990556553436</id><published>2009-12-03T06:34:00.002-03:00</published><updated>2009-12-07T08:19:02.724-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='visualvm'/><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='programação'/><title type='text'>Java Heap Dump: Analisando a utilização de memória da sua aplicação Java</title><content type='html'>&lt;div style="text-align: justify;"&gt;No post passado eu falei um pouco sobre o VisualVM mas não falei sobre como fazer o dump do heap do Java em uma máquina monitorada remotamente.&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Não dá para fazer isso usando o VisualVM. Você precisa acessar a máquina remota e executar o seguinte comando:&lt;br /&gt;&lt;/div&gt;&lt;blockquote&gt;&lt;i&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-family: 'courier new';"&gt;&lt;span style="color: #ff9900;"&gt;&lt;b&gt;jmap -F -dump:live,format=b,file=dump-heap-java.hprof PID&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;div&gt;PID é o número do processo do Java. Para saber o número do processo do Java no Linux, execute o seguinte comando:&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;blockquote&gt;&lt;i&gt;&lt;b&gt;&lt;span style="font-size: small;"&gt;&lt;span style="color: #ff9900;"&gt;ps ax|grep java&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/i&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;div style="text-align: left;"&gt;Este comando demora um pouco para ser executado, tenha paciência, pois vai depender do seu Heap Size atual. Ele vai gerar um arquivo do tamanho do heap atual. No meu caso, gerou um arquivo de 778 Mb.&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;Agora que já temos o arquivo de dump, é necessário copiá-lo para a máquina aonde tenha o VisualVM rodando.&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Carregue o arquivo no VisualVM usando o Menu File &amp;gt; Load...&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Procure o arquivo de dump do heap e abra ele.&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5410410757145542562" src="http://3.bp.blogspot.com/_AC1VTr1jYCs/SxWj6wScv6I/AAAAAAAACXA/nF6U42NyfwM/s400/Captura+de+tela+2009-12-01+%C3%A0s+21.15.41.png" style="cursor: hand; cursor: pointer; display: block; height: 298px; margin: 0px auto 10px; text-align: center; width: 400px;" /&gt;&lt;br /&gt;&lt;div&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;Agora que estamos com o dump carregado no VisualVM, vamos tentar encontrar o que está gerando problema de uso de memória na aplicação Java.&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Clique na aba Classes e será exibida uma lista com as classes, o percentual de instâncias, a quantidade de instâncias e, o que nos interessa, o tamanho alocado por essa classe.&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Vamos ordenar a lista por tamanho, clicando na coluna tamanho.&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;img alt="" border="0" src="http://lh4.ggpht.com/_AC1VTr1jYCs/SxWl0QgBAsI/AAAAAAAACXw/Z6IV2XaxKEU/s640/Captura%20de%20tela%202009-12-01%20%C3%A0s%2021.22.38.png" style="cursor: hand; cursor: pointer; display: block; height: 475px; margin: 0px auto 10px; text-align: center; width: 400px;" /&gt;&lt;br /&gt;&lt;div&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;Veja que o primeiro da lista é o byte[]. Clicando duas vezes nele, será apresentada a aba Instances contendo todas as instâncias que estão usando o byte[] na memória.&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;img alt="" border="0" src="http://lh4.ggpht.com/_AC1VTr1jYCs/SxWnoAUO4XI/AAAAAAAACX0/d2P4vuSGRYI/s640/Captura%20de%20tela%202009-12-01%20%C3%A0s%2021.32.17.png" style="cursor: hand; cursor: pointer; display: block; height: 477px; margin: 0px auto 10px; text-align: center; width: 400px;" /&gt;&lt;br /&gt;&lt;div&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;Perceba que temos várias instâncias com o mesmo tamanho (16681), o que significa que é a mesma classe que está usando o byte[] e não está desalocando o recurso.&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Clique em uma das instâncias e vai abrir na lateral direita a área References na parte inferior. Clique com o botão direito na classe que vai aparecer e em seguida escolha a opção Show Instance.&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img alt="" border="0" height="84" src="http://lh6.ggpht.com/_AC1VTr1jYCs/SxWpi_v5W2I/AAAAAAAACX4/3X26IHznSrQ/Captura%20de%20tela%202009-12-01%20%C3%A0s%2021.39.10.png" style="display: block; height: 322px; margin-bottom: 10px; margin-left: auto; margin-right: auto; margin-top: 0px; text-align: center; width: 400px;" width="200" /&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;O resultado irá mostrar o que está ocupando a memória:&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;img alt="" border="0" src="http://lh4.ggpht.com/_AC1VTr1jYCs/SxWpjIFuOPI/AAAAAAAACX8/-M1kICZIH74/s640/Captura%20de%20tela%202009-12-01%20%C3%A0s%2021.40.30.png" style="cursor: hand; cursor: pointer; display: block; height: 505px; margin: 0px auto 10px; text-align: center; width: 400px;" /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;No meu caso era um comando SQL de Insert a um banco de dados de teste MySQL. Perceba na imagem que temos o comando SQL completo, separado em vários chars.&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Associado a este dump, utilizei o dump dos threads onde vi qual a classe que estava gerando os Threads Blocked. Neste meu caso, o problema estava no servidor de Banco de Dados que estava mau configurado e não estava tendo recursos suficientes para atender a todos os requests.&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Utilizando dump de Heap e dump de threads como mostrei no meu post anterior, você conseguirá detectar todos os problemas de gerência de memória da sua aplicação.&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Uma outra funcionalidade legal que você pode utilizar no VisualVM é utilizar o JConsole somado ao plugin JTop para monitorar o consumo de CPU por threads para detectar uso excessivo de CPU gerado por algum bug no software, mas isto é assunto para um outro post.&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;Links de referência:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://happygiraffe.net/blog/2009/04/02/heap-dump-analysis/"&gt;Heap Dump Analysis&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://java.sun.com/javase/6/docs/technotes/tools/share/jmap.html"&gt;jmap - Memory Map&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7763168801418010838-4426429990556553436?l=nivaldomjunior.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nivaldomjunior.blogspot.com/feeds/4426429990556553436/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://nivaldomjunior.blogspot.com/2009/12/java-heap-dump-analisando-utilizacao-de.html#comment-form' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7763168801418010838/posts/default/4426429990556553436'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7763168801418010838/posts/default/4426429990556553436'/><link rel='alternate' type='text/html' href='http://nivaldomjunior.blogspot.com/2009/12/java-heap-dump-analisando-utilizacao-de.html' title='Java Heap Dump: Analisando a utilização de memória da sua aplicação Java'/><author><name>Nivaldo Montenegro Júnior</name><uri>http://www.blogger.com/profile/15963212778452328659</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_AC1VTr1jYCs/Swsr2fHftII/AAAAAAAACS0/LPCspCMpqYI/S220/DSC01579.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_AC1VTr1jYCs/SxWj6wScv6I/AAAAAAAACXA/nF6U42NyfwM/s72-c/Captura+de+tela+2009-12-01+%C3%A0s+21.15.41.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7763168801418010838.post-5763674498930763118</id><published>2009-12-01T09:02:00.035-03:00</published><updated>2009-12-07T08:19:23.442-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='visualvm'/><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='programação'/><title type='text'>VisualVM: Analisando o funcionamento de sua aplicação Java</title><content type='html'>&lt;div style="text-align: justify;"&gt;O desenvolvimento de aplicações em Java e a otimização é algo que requer uma atenção muito especial. Muitos por aí falam que odeiam o Java falando que é muito difícil de desenvolver, que tem problema de uso de memória e etc.&lt;/div&gt;&lt;div&gt;Os programadores Java que me desculpem, mas estou começando a achar que o problema não está no Java e sim na forma como se desenvolve e como se implanta o sistema. Acrescento ainda, o problema vem desde a Faculdade, onde não se fala absolutamente nada sobre otimização e análise de desempenho de aplicações.&lt;/div&gt;&lt;div&gt;Antes de liberar o sistema para a produção é extremamente importante fazer uma análise geral do funcionamento da aplicação, do uso de CPU, de memória e o número de threads geradas, para saber se a aplicação está alocando e desalocando os recursos corretamente, abrindo e fechando as threads, etc.&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Bom, mas vamos ao que interessa. Como fazer para monitorar a sua JVM?&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Para iniciar é necessário prepararmos a JVM para ser monitorada. Neste exemplo vou utilizar o servidor de aplicação Jetty rodando em um servidor Linux na pasta /opt/jetty.&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Abra o arquivo jetty.sh que está dentro da pasta /opt/jetty/bin/ e adicione a seguinte variável no começo do arquivo (após os comentários):&lt;/div&gt;&lt;blockquote&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="color:#FF6600;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;JAVA_OPTIONS="-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=8086 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false"&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;div&gt;Explicando cada parâmetro:&lt;/div&gt;&lt;div&gt;-Dcom.sun.management.jmxremote: Habilita o gerenciamento remoto&lt;/div&gt;&lt;div&gt;-Dcom.sun.management.jmxremote.port=8086: Porta que será usada para conexão&lt;/div&gt;&lt;div&gt;-Dcom.sun.management.jmxremote.ssl=false: Habilitar ou não o SSL&lt;/div&gt;&lt;div&gt;-Dcom.sun.management.jmxremote.authenticate=false: Se haverá necessidade de autenticação para se conectar na JVM&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Feito isto, basta iniciar o seu Jetty usando o script jetty.sh:&lt;/div&gt;&lt;div&gt;&lt;blockquote&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="color:#FF6600;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;b&gt;&lt;i&gt;/opt/jetty/bin/jetty.sh start&lt;/i&gt;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;div&gt;O seu Jetty vai iniciar e permitirá que você se conecte remotamente na JVM para fazer o monitoramento.&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;Outra opção para iniciar o jetty é executar diretamente na linha de comando:&lt;/div&gt;&lt;blockquote&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="color:#FF6600;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;java &lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/i&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="color:#FF6600;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=8086 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false &lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="color:#FF6600;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;-jar /opt/jetty/start.jar&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;div&gt;Para o monitoramento utilizaremos a excelente ferramenta da Sun chamada &lt;b&gt;VisualVM&lt;/b&gt;. Não sei se é a melhor, mas atendeu às minhas necessidades e resolveu os meus problemas. :)&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Execute o comando &lt;i&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;jvisualvm&lt;/span&gt;&lt;/i&gt; em qualquer máquina que tenha uma JVM instalada. No meu caso, uso Mac OS X Snow Leopard para o monitoramento.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;img src="http://3.bp.blogspot.com/_AC1VTr1jYCs/SxVrCIGjvfI/AAAAAAAACWI/SdY79Jy1dJ0/s320/Captura+de+tela+2009-12-01+%C3%A0s+17.13.14.png" style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 183px;" border="0" alt="" id="BLOGGER_PHOTO_ID_5410348211634421234" /&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;Tela inicial do VisualVM&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;Na coluna na lateral esquerda execute os seguintes passos para adicionar o seu servidor remoto:&lt;/div&gt;&lt;div&gt;&lt;ol&gt;&lt;li&gt;Clica com o botão direito em Remote&lt;/li&gt;&lt;li&gt;Clica em Add Remote Host...&lt;/li&gt;&lt;li&gt;Coloca o IP ou nome da máquina a ser monitorada no campo e clica em OK&lt;/li&gt;&lt;li&gt;Clica com o botão direito no Host adicionado&lt;/li&gt;&lt;li&gt;Clica em Add JMX Connection...&lt;/li&gt;&lt;li&gt;Preencha o campo Connection com IP:PORTA, onde a porta é a que foi adicionada no JAVA_OPTIONS do Jetty, no meu caso 8086, e depois clica em OK&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;Pronto, a sua JVM já vai ser monitorada. Você poderá acompanhar na aba Monitor em tempo real a utilização de CPU, Heap Size, número de classes e número de threads.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;img src="http://1.bp.blogspot.com/_AC1VTr1jYCs/SxWHYpJrdFI/AAAAAAAACWQ/J5uhK00FHwc/s320/Captura+de+tela+2009-12-01+%C3%A0s+13.57.37.png" style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 169px;" border="0" alt="" id="BLOGGER_PHOTO_ID_5410379384788579410" /&gt;&lt;div style="text-align: left;"&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;Na aba Threads, é possível monitorar os threads em tempo real.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;img src="http://2.bp.blogspot.com/_AC1VTr1jYCs/SxWLuYcReUI/AAAAAAAACWo/uMyEsIR2ydo/s320/Captura+de+tela+2009-12-01+%C3%A0s+19.32.19.png" style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 241px;" border="0" alt="" id="BLOGGER_PHOTO_ID_5410384156306798914" /&gt;&lt;img src="http://1.bp.blogspot.com/_AC1VTr1jYCs/SxWL6HJFa1I/AAAAAAAACWw/qTne3bqtpB8/s320/Captura+de+tela+2009-12-01+%C3%A0s+19.33.15.png" style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 240px;" border="0" alt="" id="BLOGGER_PHOTO_ID_5410384357821344594" /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Um recurso muito útil para descobrir problemas de má utilização de memória é fazer um dump das threads e analisar qual a thread que está ficando presa e qual classe que foi executada para causar o travamento da thread.&lt;/div&gt;&lt;div&gt;Para fazer um thread dump, basta clicar com o botão direito no IP do servidor monitorado e clicar em Thread Dump.&lt;/div&gt;&lt;div&gt;Ele vai gerar um dump de todas as threads rodando na sua JVM. Este comando pode demorar dependendo da quantidade de threads que você tem atualmente sendo executadas.&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;img src="http://2.bp.blogspot.com/_AC1VTr1jYCs/SxWIutRca2I/AAAAAAAACWY/zhX5Co3jCZw/s320/Captura+de+tela+2009-12-01+%C3%A0s+19.19.39.png" style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 218px;" border="0" alt="" id="BLOGGER_PHOTO_ID_5410380863363640162" /&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;Ao clicar duas vezes no Dump, abrirá uma nova aba com todas as informações das suas threads.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;img src="http://4.bp.blogspot.com/_AC1VTr1jYCs/SxWJtaEraAI/AAAAAAAACWg/xjpmAxrE5kg/s320/Captura+de+tela+2009-12-01+%C3%A0s+19.24.28.png" style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 242px;" border="0" alt="" id="BLOGGER_PHOTO_ID_5410381940541581314" /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Agora é só procurar por BLOCKED e aí você vai encontrar as threads que estão travadas.&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Importante:&lt;/b&gt; nem sempre uma thread blocked significa que ela ficará travada para sempre. Pode acontecer de uma thread que esteja fazendo alguma operação com um banco de dados esteja esperando recurso disponível para executar o processo e aí ela fica blocked até o recurso ficar disponível. Neste caso, o problema pode estar no seu banco de dados que não está suportando a quantidade de transações, no seu pool de conexões ou no seu SQL que está mau feito.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Ah... lembrei de uma coisa legal. Se você está rodando o servidor de aplicação no mesmo host do VisualVM, você pode fazer dump do Heap do Java e fazer a análise no VisualVM. Se a aplicação está rodando remotamente, então para fazer o dump do heap e analisá-lo, é necessário fazer alguns passos extras. Mas não se preoculpe, no meu próximo post eu falarei sobre isso... :)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Agora é só você brincar com a ferramenta e descobrir o que é possível fazer com ela. :)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Links de relacionados:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://java.dzone.com/news/visual-vm-free-and-open-source/"&gt;VisualVM: Free and Open Source Java Troubleshooter&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://java.sun.com/developer/technicalArticles/J2SE/monitoring/"&gt;Monitoring and Managing Java SE 6 Platform Applications&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://visualvm.dev.java.net/"&gt;VisualVM&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://java.sun.com/javase/6/docs/technotes/guides/visualvm/"&gt;Java VisualVM&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7763168801418010838-5763674498930763118?l=nivaldomjunior.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nivaldomjunior.blogspot.com/feeds/5763674498930763118/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://nivaldomjunior.blogspot.com/2009/12/visualvm-analisando-o-funcionamento-de.html#comment-form' title='1 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7763168801418010838/posts/default/5763674498930763118'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7763168801418010838/posts/default/5763674498930763118'/><link rel='alternate' type='text/html' href='http://nivaldomjunior.blogspot.com/2009/12/visualvm-analisando-o-funcionamento-de.html' title='VisualVM: Analisando o funcionamento de sua aplicação Java'/><author><name>Nivaldo Montenegro Júnior</name><uri>http://www.blogger.com/profile/15963212778452328659</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_AC1VTr1jYCs/Swsr2fHftII/AAAAAAAACS0/LPCspCMpqYI/S220/DSC01579.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_AC1VTr1jYCs/SxVrCIGjvfI/AAAAAAAACWI/SdY79Jy1dJ0/s72-c/Captura+de+tela+2009-12-01+%C3%A0s+17.13.14.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7763168801418010838.post-757176135482362630</id><published>2009-11-30T15:09:00.006-03:00</published><updated>2009-12-07T08:19:52.596-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='replace'/><category scheme='http://www.blogger.com/atom/ns#' term='sed'/><title type='text'>Dica: Como substituir uma String em vários arquivos ao mesmo tempo</title><content type='html'>Hoje precisei substituir uma String em 51 arquivos VXML. Como fazer isso? Editar um por um? Não... isso é coisa pra quem usa Windows! :)&lt;div&gt;Para quem tem um Linux basta usar o comando &lt;i&gt;&lt;b&gt;replace&lt;/b&gt;&lt;/i&gt; ou então o &lt;i&gt;&lt;b&gt;sed&lt;/b&gt;&lt;/i&gt;.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Exemplo usando sed:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;blockquote&gt;for i in * ; do sed -i 's/ORIGINAL/NOVO/g' $i; done&lt;/blockquote&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Exemplo usando o replace:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"   style="  color: rgb(17, 17, 17); line-height: 18px; font-family:Consolas, 'Andale Mono', Courier, 'Courier New';font-size:13px;"&gt;&lt;blockquote&gt;replace ORIGINAL NOVO &lt; oldfile &gt; newfile&lt;/blockquote&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"    style="font-family:Consolas, 'Andale Mono', Courier, 'Courier New';font-size:100%;color:#111111;"&gt;&lt;span class="Apple-style-span"  style=" line-height: 18px;font-size:13px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"   style="  color: rgb(17, 17, 17); line-height: 18px; font-family:Consolas, 'Andale Mono', Courier, 'Courier New';font-size:13px;"&gt;&lt;span class="Apple-style-span"   style="color: rgb(0, 0, 0);  line-height: normal;  font-family:Georgia, serif;font-size:16px;"&gt;Usei o sed para fazer o trabalho por que achei mais fácil. Mas tá aí a dica pra quem precisar.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7763168801418010838-757176135482362630?l=nivaldomjunior.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nivaldomjunior.blogspot.com/feeds/757176135482362630/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://nivaldomjunior.blogspot.com/2009/11/dica-como-substituir-uma-string-em.html#comment-form' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7763168801418010838/posts/default/757176135482362630'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7763168801418010838/posts/default/757176135482362630'/><link rel='alternate' type='text/html' href='http://nivaldomjunior.blogspot.com/2009/11/dica-como-substituir-uma-string-em.html' title='Dica: Como substituir uma String em vários arquivos ao mesmo tempo'/><author><name>Nivaldo Montenegro Júnior</name><uri>http://www.blogger.com/profile/15963212778452328659</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_AC1VTr1jYCs/Swsr2fHftII/AAAAAAAACS0/LPCspCMpqYI/S220/DSC01579.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7763168801418010838.post-8455610227636324577</id><published>2009-11-26T06:15:00.004-03:00</published><updated>2009-12-07T08:20:26.544-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='jetty'/><category scheme='http://www.blogger.com/atom/ns#' term='outofmemory'/><category scheme='http://www.blogger.com/atom/ns#' term='programação'/><title type='text'>java.lang.OutOfMemoryError: Dica para quem tem esse tipo de problema com Java</title><content type='html'>O Java é uma linguagem de programação muito poderosa, mas desde que me entendo por gente, tem problema de gerenciamento de memória.&lt;div&gt;&lt;br /&gt;&lt;div&gt;Recentemente, realizamos a implantação de uma URA (Unidade de Resposta Audível) que tem um backend para integração com o CTI e com a base de dados do cliente. Toda a integração foi desenvolvida em Java e rodava inicialmente em Tomcat, mas foi migrada para o Jetty com o objetivo de evitar problemas de gerenciamento de memória.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Eis que um belo dia, surge a surpresa. O &lt;b&gt;&lt;span class="Apple-style-span"  style="color:#FF6600;"&gt;Jetty&lt;/span&gt;&lt;/b&gt; simplesmente &lt;b&gt;&lt;span class="Apple-style-span"  style="color:#FF9900;"&gt;fechava&lt;/span&gt;&lt;/b&gt;, depois de um período de produção, com carga. O processo desaparecia e não tinha nada no log mostrando o que houve.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Começamos a monitorar o sistema e recebi a seguinte mensagem no prompt quando o problema aconteceu novamente:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;blockquote&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;# An unexpected error has been detected by Java Runtime Environment:&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;#&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;# java.lang.OutOfMemoryError: requested 264496 bytes for Chunk::new. Out of swap space?&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;#&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;#  Internal Error (414C4C4F434154494F4E0E43505000C7), pid=7896, tid=1878612880&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;#&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;# Java VM: Java HotSpot(TM) Server VM (1.6.0-b105 mixed mode)&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;# An error report file with more information is saved as hs_err_pid7896.log&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;[thread 1406139280 also had an error]&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;#&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;# If you would like to submit a bug report, please visit:&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;#   http://java.sun.com/webapps/bugreport/crash.jsp&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;#&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Pesquisei na Internet e encontrei informações referentes a um possível bug na Java VM. Putz, como eu estava com sorte. Tudo bem. Atualizei para a última JVM, colocamos na produção novamente e o problema apareceu novamente.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Vi em vários sites na Internet orientando para aumentar o heap através do parâmetro -Xmx. Testei, mas não funcionou.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Foi então que descobri que o problema estava relacionado a uma limitação da JVM 32bits de usar no máximo 2GB no heap size. Ou seja, o Jetty começava a alocar os recursos e quando chegava nos 2GB de alocação, gerava esse problema de OutOfMemoryError.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Helvetica, Arial, sans-serif; font-size: 17px; color: rgb(0, 51, 102); font-weight: bold; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; "&gt;&lt;/span&gt;&lt;/div&gt;&lt;blockquote&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Helvetica, Arial, sans-serif; font-size: 17px; color: rgb(0, 51, 102); font-weight: bold; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; "&gt;java.lang.OutOfMemoryError: requested 32756 bytes for ChunkPool::allocate. Out of swap space?&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Helvetica, Arial, sans-serif; font-size: 13px; line-height: 17px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; "&gt;&lt;p style="font-size: 10pt; line-height: 13pt; color: rgb(0, 0, 0); font-weight: normal; margin-top: 10px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "&gt;Essentially the native objects does not have enough memory to use. This is usually because you have allocated too much memory to your heap reducing the amount available for native objects. See &lt;a href="http://www.codingthearchitecture.com/2008/01/14/jvm_lies_the_outofmemory_myth.html" class="external-link" rel="nofollow" style="color: rgb(0, 51, 102); "&gt;this article&lt;/a&gt;.&lt;/p&gt;&lt;p style="font-size: 10pt; line-height: 13pt; color: rgb(0, 0, 0); font-weight: normal; margin-top: 10px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "&gt;The solution is to reduce the amount of heap memory you have allocated. For example if you have set -Xmx4096, you should consider reducing this to -Xmx2048m.&lt;/p&gt;&lt;p style="font-size: 10pt; line-height: 13pt; color: rgb(0, 0, 0); font-weight: normal; margin-top: 10px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "&gt;Remember if you are using a 32bit JVM you cannot allocate more than -Xmx2048m for linux (and even less for windows). Using a 64 bit JVM can resolve this problem, but is not recommended for fisheye/crucible instances (refer to &lt;a href="http://confluence.atlassian.com/display/FISHEYE/System+Requirements" class="external-link" rel="nofollow" style="color: rgb(0, 51, 102); "&gt;System Requirements&lt;/a&gt;).&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;div&gt;&lt;br /&gt;&lt;b&gt;Solução:&lt;/b&gt; Limitar o seu max heap size em 2048.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;Para quem precisa fazer tunning em servidores de aplicação Java seguem alguns links úteis:&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://java.sun.com/performance/reference/whitepapers/tuning.html"&gt;Java Tunning White Paper&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://java.sun.com/javase/technologies/hotspot/vmoptions.jsp"&gt;Java HotSpot VM Options&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://confluence.atlassian.com/display/FISHEYE/Fix+Out+of+Memory+errors+by+increasing+available+memory#FixOutofMemoryerrorsbyincreasingavailablememory-java.lang.OutOfMemoryError%3Arequested32756bytesforChunkPool%3A%3Aallocate.Outofswapspace%3F"&gt;Fix Out of Memory errors by increasing available memory&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7763168801418010838-8455610227636324577?l=nivaldomjunior.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nivaldomjunior.blogspot.com/feeds/8455610227636324577/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://nivaldomjunior.blogspot.com/2009/11/javalangoutofmemoryerror-dica-para-quem.html#comment-form' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7763168801418010838/posts/default/8455610227636324577'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7763168801418010838/posts/default/8455610227636324577'/><link rel='alternate' type='text/html' href='http://nivaldomjunior.blogspot.com/2009/11/javalangoutofmemoryerror-dica-para-quem.html' title='java.lang.OutOfMemoryError: Dica para quem tem esse tipo de problema com Java'/><author><name>Nivaldo Montenegro Júnior</name><uri>http://www.blogger.com/profile/15963212778452328659</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_AC1VTr1jYCs/Swsr2fHftII/AAAAAAAACS0/LPCspCMpqYI/S220/DSC01579.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7763168801418010838.post-2887481752808456858</id><published>2009-11-24T04:36:00.013-03:00</published><updated>2009-12-07T08:20:47.023-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='memória'/><category scheme='http://www.blogger.com/atom/ns#' term='macbook'/><category scheme='http://www.blogger.com/atom/ns#' term='apple'/><title type='text'>Como mudar a memória de um Macbook Pro Unibody</title><content type='html'>&lt;div style="text-align: justify;"&gt;Vou re-ativar o meu blog e tentar mantê-lo atualizado. Nos últimos anos tenho tentado fazer isso, mas infelizmente, devido ao tempo não tenho conseguido.&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;div style="text-align: justify;"&gt;Vou iniciar os meus posts falando sobre como trocar a memória no Macbook Pro 15' Unibody.&lt;/div&gt;&lt;/div&gt;Ontem tomei coragem e finalmente comprei 4GB de memória RAM DDR3 para o meu Macbook Pro 15' Unibody. Estava realmente precisando.A troca da memória no Macbook Pro é um processo bem simples que não precisa de muito trabalho para ser realizado.&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 307px; height: 320px;" src="http://3.bp.blogspot.com/_AC1VTr1jYCs/SwuRVuUvIUI/AAAAAAAACTo/q7otyR-L-rU/s320/Captura+de+tela+2009-11-23+%C3%A0s+20.11.43.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5407575579986698562" /&gt;&lt;div style="text-align: center;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;Antes da troca: 2GB de RAM&lt;/span&gt;&lt;/div&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 214px;" src="http://1.bp.blogspot.com/_AC1VTr1jYCs/SwuN3orl00I/AAAAAAAACTY/mQ9FyBcjnHk/s320/IMAG0050.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5407571764540986178" /&gt;&lt;div&gt;&lt;div&gt;&lt;div style="text-align: center;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;Parte de cima do Meu Macbook Pro 15' Unibody&lt;/span&gt;&lt;/div&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 214px;" src="http://3.bp.blogspot.com/_AC1VTr1jYCs/SwuOZE_t4TI/AAAAAAAACTg/yQ84RMiUUfU/s320/IMAG0054.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5407572339077275954" /&gt;&lt;div style="text-align: center;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;Parte de trás do Macbook Pro&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;É necessário uma chave philips pequena para retirar os parafusos da tampa traseira do Macbook. Utilizei o kit de chaves abaixo para realizar a abertura da tampa.&lt;/div&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 214px; height: 320px;" src="http://3.bp.blogspot.com/_AC1VTr1jYCs/SwuR-3lKMgI/AAAAAAAACTw/yvY9aa6bPus/s320/IMAG0053.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5407576286846136834" /&gt;&lt;div style="text-align: justify;"&gt;Vamos iniciar a troca. Primeiro, remova a tampa da bateria que não é presa por parafusos, apenas por uma trava e em seguida remova a bateria.&lt;/div&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 214px;" src="http://2.bp.blogspot.com/_AC1VTr1jYCs/SwuSuJ9UlAI/AAAAAAAACUQ/bMb4BXi5SRU/s320/IMAG0056.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5407577099233170434" /&gt;&lt;div style="text-align: justify;"&gt;Abra a tampa traseira do Macbook usando a chave Philips e retire os 8 parafusos. Remova a bateria antes de realizar a troca da memória.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Depois de remover a tampa o seu Macbook ficará assim:&lt;/div&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 214px; height: 320px;" src="http://3.bp.blogspot.com/_AC1VTr1jYCs/SwuS7cK49UI/AAAAAAAACUY/YeKdkTDTKyQ/s320/IMAG0057.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5407577327460218178" /&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 214px;" src="http://4.bp.blogspot.com/_AC1VTr1jYCs/SwuVsl2kojI/AAAAAAAACVY/4v2RGLoY7AA/s320/IMAG0059.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5407580370896200242" /&gt;Agora que está aberto, basta remover as duas memórias antigas do Macbook e adicionar as duas memórias novas. Feche o Macbook e ligue para testar.&lt;div style="text-align: center;"&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;O resultado, seu Macbook agora terá 4Gb de RAM e ficará uma bala! :)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="text-align: center;"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 307px; height: 320px;" src="http://2.bp.blogspot.com/_AC1VTr1jYCs/SwuVeEsMzTI/AAAAAAAACVQ/okMWYGMMlg4/s320/Captura+de+tela+2009-11-23+%C3%A0s+20.33.07.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5407580121476156722" /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7763168801418010838-2887481752808456858?l=nivaldomjunior.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nivaldomjunior.blogspot.com/feeds/2887481752808456858/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://nivaldomjunior.blogspot.com/2009/11/como-mudar-memoria-de-um-macbook-pro.html#comment-form' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7763168801418010838/posts/default/2887481752808456858'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7763168801418010838/posts/default/2887481752808456858'/><link rel='alternate' type='text/html' href='http://nivaldomjunior.blogspot.com/2009/11/como-mudar-memoria-de-um-macbook-pro.html' title='Como mudar a memória de um Macbook Pro Unibody'/><author><name>Nivaldo Montenegro Júnior</name><uri>http://www.blogger.com/profile/15963212778452328659</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_AC1VTr1jYCs/Swsr2fHftII/AAAAAAAACS0/LPCspCMpqYI/S220/DSC01579.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_AC1VTr1jYCs/SwuRVuUvIUI/AAAAAAAACTo/q7otyR-L-rU/s72-c/Captura+de+tela+2009-11-23+%C3%A0s+20.11.43.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7763168801418010838.post-5474332660389846271</id><published>2009-01-25T13:47:00.002-03:00</published><updated>2009-01-25T14:28:20.939-03:00</updated><title type='text'>Compartilhando informações</title><content type='html'>Por diversos anos tentei criar um site pessoal com informações de áreas do meu interesse, testei Drupal, Wordpress e Joomla, utilizei cada um dos CMS por um tempo, mas nunca consegui manter o site sempre atualizado. Resolvi então, abandonar os CMS e abrir um Blog! Acho que ficará mais fácil de atualizar...&lt;br /&gt;Espero estar começando um Blog com informações que sirvam para todos que trabalham com Asterisk, Linux, roteadores Cisco e outras tecnologias que eu esteja trabalhando.&lt;br /&gt;Bom... espero que isto seja apenas o começo...&lt;br /&gt;&lt;br /&gt;Abraço a todos!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7763168801418010838-5474332660389846271?l=nivaldomjunior.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nivaldomjunior.blogspot.com/feeds/5474332660389846271/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://nivaldomjunior.blogspot.com/2009/01/compartilhando-informaes.html#comment-form' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7763168801418010838/posts/default/5474332660389846271'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7763168801418010838/posts/default/5474332660389846271'/><link rel='alternate' type='text/html' href='http://nivaldomjunior.blogspot.com/2009/01/compartilhando-informaes.html' title='Compartilhando informações'/><author><name>Nivaldo Montenegro Júnior</name><uri>http://www.blogger.com/profile/15963212778452328659</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_AC1VTr1jYCs/Swsr2fHftII/AAAAAAAACS0/LPCspCMpqYI/S220/DSC01579.jpg'/></author><thr:total>0</thr:total></entry></feed>
