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

<channel>
	<title>Arnaldo Nascimento</title>
	<atom:link href="http://www.arnaldonascimento.com/tech/wordpress/?feed=rss2" rel="self" type="application/rss+xml" />
	<link>http://www.arnaldonascimento.com/tech/wordpress</link>
	<description>My digital world...</description>
	<pubDate>Tue, 22 Jun 2010 19:39:22 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.7.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Segurança de informações (Parte II)</title>
		<link>http://www.arnaldonascimento.com/tech/wordpress/?p=154</link>
		<comments>http://www.arnaldonascimento.com/tech/wordpress/?p=154#comments</comments>
		<pubDate>Wed, 16 Jun 2010 02:42:41 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[Segurança da Informação]]></category>

		<guid isPermaLink="false">http://www.arnaldonascimento.com/tech/wordpress/?p=154</guid>
		<description><![CDATA[Cada vez mais, as organizações e seus sistemas de informação e redes enfrentam ameaças de segurança vindas das mais diversas fontes, incluindo fraudes através de computadores, espionagem, sabotagem, vandalismo, incêndio ou enchentes. Fontes de prejuizos tais como vírus de computador, hackers e ataques de negação de serviços têm se tornado mais comuns, mais ambiciosos e cada vez mais sofisticados.
Devido [...]]]></description>
			<content:encoded><![CDATA[<p>Cada vez mais, as organizações e seus sistemas de informação e redes enfrentam ameaças de segurança vindas das mais diversas fontes, incluindo fraudes através de computadores, espionagem, sabotagem, vandalismo, incêndio ou enchentes. Fontes de prejuizos tais como vírus de computador, hackers e ataques de negação de serviços têm se tornado mais comuns, mais ambiciosos e cada vez mais sofisticados.</p>
<p>Devido à dependência de sistemas e serviços de informação, as organizações estão mais vulneráveis às  ameaças contra segurança. A interconexão de redes públicas e privadas e o compartilhamento de recursos de informação aumentam a dificuldade de se conseguir controle de acesso. A tendência ao processaamento distribuído, vem enfraquecendo a efetividade do controle central especializado.</p>
<p><em>A segurança que pode ser obtida através de meios técnicos é limitada, e deveria ser apoiada por procedimentos e gestão adequados. <img src='http://www.arnaldonascimento.com/tech/wordpress/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </em></p>
]]></content:encoded>
			<wfw:commentRss>http://www.arnaldonascimento.com/tech/wordpress/?feed=rss2&amp;p=154</wfw:commentRss>
		</item>
		<item>
		<title>Cálculos para acompanhamento de pacientes que estão sob respiração mecânica</title>
		<link>http://www.arnaldonascimento.com/tech/wordpress/?p=151</link>
		<comments>http://www.arnaldonascimento.com/tech/wordpress/?p=151#comments</comments>
		<pubDate>Mon, 14 Jun 2010 07:09:26 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[Códigos]]></category>

		<category><![CDATA[Fisioterapia respiratória]]></category>

		<category><![CDATA[Gasometria]]></category>

		<category><![CDATA[Java]]></category>

		<category><![CDATA[Mobile]]></category>

		<category><![CDATA[Ventilação mecânica]]></category>

		<guid isPermaLink="false">http://www.arnaldonascimento.com/tech/wordpress/?p=151</guid>
		<description><![CDATA[Pessoal, estou fazendo um sistema para um amigo, profissional em terapia respiratória. É um sistema p/celular em Java que terá uma parte desktop .NET. E segue abaixo a parte mais complicada que são as fórmulas.
O uso delas  fica por sua conta e risco, pois elas foram feitas com base em vários depoimentos médicos e literatura especializada. [...]]]></description>
			<content:encoded><![CDATA[<p>Pessoal, estou fazendo um sistema para um amigo, profissional em terapia respiratória. É um sistema p/celular em Java que terá uma parte desktop .NET. E segue abaixo a parte mais complicada que são as fórmulas.</p>
<p>O uso delas  fica por sua conta e risco, pois elas foram feitas com base em vários depoimentos médicos e literatura especializada. E como em toda área  existem divergências, e na medicina não é diferente. O uso delas deve ser OBRIGATORIAMENTE acompanhado por um ou mais profissionais de medicina. Mas serve como base de estudos e pra matar a curiosidade também, já que é uma área de pequena participação do mundo Java.</p>
<p>OBS:  nao consegui identar de forma alguma no tema que escolhi no worpress</p>
<p>/**<br />
*<br />
* todo: Todos os parametros que tiverem sufixo &#8220;atual&#8221;  são da gasometria<br />
*<br />
*<br />
*<br />
*<br />
*/<br />
package com.arnaldo nascimento.formulas;</p>
<p>/**<br />
*<br />
* @author root<br />
*/<br />
public class FormulasCalculos {</p>
<p>public static double getAnionGapCorrigido(double naGasometria, double kGasometria, double albumina, double clGasometria, double hco3, double lactato) {<br />
double res = 0.0;<br />
res = (((naGasometria + kGasometria) - (clGasometria + hco3)) + ((40 - albumina) * 0.25) - lactato);<br />
return res;<br />
}</p>
<p>public static double IMC(double peso, double altura) {<br />
double res = 0.0;<br />
res = peso * (altura * altura);<br />
return res;<br />
}</p>
<p>/**<br />
*<br />
* @param altura<br />
* @param peso<br />
* @param sexo<br />
* @return<br />
*/<br />
public static double getPesoIdeal(double altura, double peso, String sexo) {<br />
double res = 0.0;<br />
if (sexo.equals(&#8221;M&#8221;)) { //Masculino<br />
res = 22 * (altura * altura);<br />
}<br />
else { //Feminino<br />
res = 20.8 * (altura * altura);<br />
}<br />
return res;<br />
}</p>
<p>/* Outros<br />
Vt =  Sara   4 a 6 ml/kg<br />
DPOC*/</p>
<p>public static double getVT( Double sara,<br />
Double outros, Double dpoc,<br />
double altura,<br />
double peso, String sexo) {<br />
double val = 0.0;</p>
<p>//SARA<br />
if (sara != null) {<br />
val = sara.doubleValue();<br />
}</p>
<p>//OUTROS<br />
if (outros != null) {<br />
val = sara.doubleValue();<br />
}</p>
<p>//DPOC<br />
if (dpoc != null) {<br />
val = sara.doubleValue();<br />
}</p>
<p>val = val * FormulasCalculos.getPesoIdeal(altura, peso,   sexo);<br />
return val;<br />
}</p>
<p>/**<br />
* FResp ideal = (paCo2atual * FR atual) / PaCOs ideal<br />
* @param paco2Atual<br />
* @param frAtual<br />
* @param idade<br />
* @return<br />
*/<br />
public static double getFrespIdeal(double paco2Atual, double frAtual, double idade) {<br />
double res = 0.0;<br />
res = (paco2Atual * frAtual) / FormulasCalculos.getPaCO2Ideal(null);<br />
return res;<br />
}</p>
<p>/**<br />
* FiO2 ideal = (PaO2 atual x FiO2 atual) / (109 â€“ (0,43 x idade))<br />
* @param pao2Atual<br />
* @param fio2Atual<br />
* @return<br />
*/<br />
public static double getfiO2Ideal(double pao2Atual, double fio2Atual, double idade) {<br />
double res = 0.0;<br />
res = ((pao2Atual * fio2Atual) / FormulasCalculos.getPaO2IdealArterial(idade));<br />
return res;<br />
}</p>
<p>/**<br />
* Cdin =   500/ PPICO - PEEP<br />
* @param pPico<br />
* @param peep<br />
* @return<br />
*/<br />
public static double getCdin(double pPico, double peep) {<br />
double res = 0.0;<br />
res = (500 / (pPico - peep));<br />
return res;<br />
}</p>
<p>/**<br />
* Cest =   500/ PPLATÃ” - PEEP<br />
* @param pPlato<br />
* @param peep<br />
* @return<br />
*/<br />
public static double getCest(double pPlato, double peep) {<br />
double res = 0.0;<br />
res = (500 / (pPlato - peep));<br />
return res;<br />
}</p>
<p>/**<br />
* Rsr = ((PPICO - PPLATO) / 30);<br />
* @param pPlato<br />
* @param pPico<br />
* @return<br />
*/<br />
public static double gerRsr(double pPlato, double pPico) {<br />
double res = 0.0;<br />
res = ((pPico - pPlato) / 30);<br />
return res;<br />
}</p>
<p>/**<br />
* PaO2 ideal = 109 â€“ (0,43 x idade)<br />
* @param idade<br />
* @return<br />
*/<br />
public static double getPaO2IdealArterial(double idade) {<br />
return (109 - (0.43 * idade));<br />
}</p>
<p>/**<br />
* TODO: deixa default 40, e liberado pra preenchimento de outros valores<br />
* @return<br />
*/<br />
public static double getPaCO2Ideal(Double val) {<br />
double res = 40;<br />
if (val != null) {<br />
res = val.doubleValue();<br />
}<br />
return res;<br />
}</p>
<p>/**<br />
* FRideal = (FRatual x PaCO2atual) / PaCO2ideal<br />
* @param frAtual<br />
* @param paco2Atual<br />
* @return<br />
*/<br />
public static double getFrIdeal(double frAtual, double paco2Atual) {<br />
double res = (frAtual * paco2Atual) / FormulasCalculos.getPaCO2Ideal(null);<br />
return res;<br />
}</p>
<p>public static double getPAO2Auvelar(double pb, double fiO2Atual, double paCo2Atual) {<br />
double res = 0.0;<br />
res = fiO2Atual * ((pb - 47) - paCo2Atual);<br />
res = res / 0.8;<br />
return res;<br />
}</p>
<p>/**<br />
* @param fiO2Atual<br />
* @param paO2Atual<br />
* @return<br />
*/<br />
public static double getFiO2Ideal(double fiO2Atual, double paO2Atual, double idade, Double pao2Gasometria) {<br />
double res = 0.0;<br />
if (pao2Gasometria != null) {<br />
res = (pao2Gasometria.doubleValue() * fiO2Atual);<br />
} else {<br />
res = (FormulasCalculos.getPaO2IdealArterial(idade) * fiO2Atual);<br />
}</p>
<p>res = res / paO2Atual;<br />
return res;<br />
}</p>
<p>//********** Valores para LIMITES COMPENSATÓRIOS DOS PULMÕES **********//<br />
/**<br />
/* AcidoseMetabolica<br />
* PaCO2 esperada = 1,5 x [HCO3] + 8 (Â± 2);<br />
*<br />
* @param hco3<br />
* @return<br />
*/<br />
public static double[] getAcidoseMetabolica(double hco3) {<br />
double[] res = new double[]{0.0, 0.0};<br />
double part = (1.5 * hco3) + 8; //(Â± 2)<br />
res[0] = part + 2;<br />
res[1] = part - 2;<br />
return res;<br />
}</p>
<p>/**<br />
* Alcalose metabólica<br />
* PaCO2 esperada = 0,7 x [HCO3] + 20 (Â± 5);<br />
* @param hco3<br />
* @return<br />
*/<br />
public static double[] getAlcaloseMetabolica(double hco3) {<br />
double res[] = new double[]{0.0, 0.0};<br />
double part = (0.7 * hco3) + 20; // (Â± 5);<br />
res[0] = part + 5;<br />
res[0] = part - 5;<br />
return res;<br />
}</p>
<p>/**<br />
*  Acidose respiratória  aguda<br />
*  [HCO3] esperado =  24 + [( PaCO2 atual â€“ 40 ) / 10]<br />
* @param paco2Atual<br />
* @return<br />
*/<br />
public static double getAcidoseRespiratoriaAguda(double paco2Atual) {<br />
double res = 0.0;<br />
res = 24 + ((paco2Atual - 40) / 10);<br />
return res;<br />
}</p>
<p>/**<br />
*  Acidose respiratória crônica<br />
*  [HCO3] esperado =  24 + 4 x  [( PaCO2 atual â€“ 40 )  / 10]<br />
* @param paco2Atual<br />
* @return<br />
*/<br />
public static double getAcidoseRespiratoriaCronica(double paco2Atual) {<br />
double res = 0.0;<br />
res = 24 + (4 * ((paco2Atual - 40) / 10));<br />
return res;<br />
}</p>
<p>/**<br />
*  Alcalose respiratória aguda<br />
*  [HCO3] esperado =  24 - 2 x  [( 40 - PaCO2 atual  ) / 10 ]<br />
* @param paco2Atual<br />
* @return<br />
*/<br />
public static double getAlcaloseRespiratoriaAguda(double paco2Atual) {<br />
double res = 0.0;<br />
res = 24 - (2 * ((40 - paco2Atual) / 10));<br />
return res;<br />
}</p>
<p>/**<br />
*  Alcalose respiratória  aguda<br />
*  [HCO3] esperado =  24 - 5 x  [( 40 - PaCO2 atual ) / 10]<br />
* @param paoc2Atual<br />
* @return<br />
*/<br />
//TODO: renomear funcao<br />
public static double getAlcaloseRespiratoriaAgudaCronica(double paoc2Atual) {<br />
double res = 0.0;<br />
res = 24 - (5 * ((40 - paoc2Atual) / 10));<br />
return res;<br />
}<br />
}</p>
]]></content:encoded>
			<wfw:commentRss>http://www.arnaldonascimento.com/tech/wordpress/?feed=rss2&amp;p=151</wfw:commentRss>
		</item>
		<item>
		<title>Segurança de informações (Parte I)</title>
		<link>http://www.arnaldonascimento.com/tech/wordpress/?p=147</link>
		<comments>http://www.arnaldonascimento.com/tech/wordpress/?p=147#comments</comments>
		<pubDate>Wed, 09 Jun 2010 19:49:41 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[Segurança da Informação]]></category>

		<category><![CDATA[Seguranca]]></category>

		<guid isPermaLink="false">http://www.arnaldonascimento.com/tech/wordpress/?p=147</guid>
		<description><![CDATA[Informações são ativos que, como qualquer outro ativo importante para os negócios,
possuem valor para uma organização e consequentemete precisam ser protegidos adequadamente.
As informações podem existir sob muitas formas. Podem ser impressas ou escritas em papel, armazenadas eletronicamente,
enviadas pelo correio eletronico,ou usando meios e eletrônicos, mostradas em filmes, ou faladas em conversas.
Qualquer forma que seja que [...]]]></description>
			<content:encoded><![CDATA[<p><em>Informações são ativos que, como qualquer outro ativo importante para os negócios,<br />
possuem valor para uma organização e consequentemete precisam ser protegidos adequadamente.</em></p>
<p>As informações podem existir sob muitas formas. Podem ser impressas ou escritas em papel, armazenadas eletronicamente,<br />
enviadas pelo correio eletronico,ou usando meios e eletrônicos, mostradas em filmes, ou faladas em conversas.<br />
Qualquer forma que seja que as informações assumam, ou os meios, pelos quais sejam compartilhadas ou armazenadas,<br />
elas devem ser sempre protegidas adequadamente.</p>
<p>A segurança de informações protege as informações contra uma ampla gama de ameaças, para assegurar a continuidade dos negócios,<br />
minimizar prejuízos e maximizar o retorno de investimentos e oportunidades comerciais.</p>
<p><strong>Características</strong></p>
<p>A segurança de informações é caracterizada como a preservação de:</p>
<blockquote>
<ul>
<li>confidencialidade: garantir que as informações sejam acessíveis apenas àqueles autorizados a terem acesso;</li>
<li>integridade: salvaguardar a exatidão e intereireza das informações e métodos de processamento;</li>
<li> disponibilidade: garantir que os usuários autorizados tenham acesso às infomações e ativos associados quando necessário.</li>
</blockquote>
<p><strong>Conclusão</strong></p>
<p>A segurança das informações é obtida através da implantação de um conjunto adequado de controles, que podem ser políticas,<br />
práticas, procedimentos, estruturas organizacionais e funções e funções de software.<br />
Esses controles precisam ser estabelecidos para assegurar que os objetivos de segurança<br />
específicos da organização sejam alcançados.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.arnaldonascimento.com/tech/wordpress/?feed=rss2&amp;p=147</wfw:commentRss>
		</item>
		<item>
		<title>Requisitos para instalação do IBM BPM Suite no Red Hat</title>
		<link>http://www.arnaldonascimento.com/tech/wordpress/?p=138</link>
		<comments>http://www.arnaldonascimento.com/tech/wordpress/?p=138#comments</comments>
		<pubDate>Fri, 13 Nov 2009 07:00:04 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[BPM]]></category>

		<category><![CDATA[Clustering]]></category>

		<category><![CDATA[IBM]]></category>

		<category><![CDATA[IBM BPM Suite]]></category>

		<category><![CDATA[Red Hat]]></category>

		<guid isPermaLink="false">http://www.arnaldonascimento.com/tech/wordpress/?p=138</guid>
		<description><![CDATA[Estou trabalhando em um projeto de clusterização de várias ferramentas da IBM, entre elas está a suite de BPM. O sistema operacional definido foi o Red Hat Enterprise Linux (RHEL) 5.0 Server/Advanced (Update 1). Então pra quem for fazer uma instalação parecida, aí vai a pequena lista de bibliotecas necessárias para a execução desta tarefa:
compat-libstdc++-33-3.2.3-61
compat-db-4.2.52-5.1
libXp-1.0.0-8
libXmu-1.0.2-5
libXtst-1.0.1-3.1
pam-0.99.6.2-3.26.el5
rpm-build-4.4.2-37.architecture.el5 [...]]]></description>
			<content:encoded><![CDATA[<p>Estou trabalhando em um projeto de clusterização de várias ferramentas da IBM, entre elas está a suite de BPM. O sistema operacional definido foi o<strong> Red Hat Enterprise Linux (RHEL) 5.0 Server/Advanced (Update 1).</strong> Então pra quem for fazer uma instalação parecida, aí vai a pequena lista de bibliotecas necessárias para a execução desta tarefa:</p>
<blockquote><p>compat-libstdc++-33-3.2.3-61<br />
compat-db-4.2.52-5.1<br />
libXp-1.0.0-8<br />
libXmu-1.0.2-5<br />
libXtst-1.0.1-3.1<br />
pam-0.99.6.2-3.26.el5<br />
rpm-build-4.4.2-37.architecture.el5  or later<br />
elfutils-0.125-3.el5<br />
elfutils-libs-0.125-3.el5</p></blockquote>
<p>So sad <img src='http://www.arnaldonascimento.com/tech/wordpress/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.arnaldonascimento.com/tech/wordpress/?feed=rss2&amp;p=138</wfw:commentRss>
		</item>
		<item>
		<title>Cache de objetos com o Memcache</title>
		<link>http://www.arnaldonascimento.com/tech/wordpress/?p=121</link>
		<comments>http://www.arnaldonascimento.com/tech/wordpress/?p=121#comments</comments>
		<pubDate>Wed, 23 Sep 2009 17:45:22 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[Performance]]></category>

		<category><![CDATA[cache]]></category>

		<category><![CDATA[memcache]]></category>

		<category><![CDATA[memcached]]></category>

		<category><![CDATA[PHP]]></category>

		<category><![CDATA[ruby]]></category>

		<guid isPermaLink="false">http://www.arnaldonascimento.com/tech/wordpress/?p=121</guid>
		<description><![CDATA[O Memcached foi desenvolvido pela Danga Interactive para
atender ao livejournal.com um
site com mais de 20 milhões de acessos dinâmicos por dia.
Hoje ele é distribuido sob a permissive free software license e pode
ser baixado em http://danga.com/memcached/dist/
Pre-requisito
O Memcached utiliza a libevent, e caso seu sistma não possua esta biblioteca
você poderá baixa-la em http://www.monkey.org/~provos/libevent-1.4.8-stable.tar.gz
e seguir os passos:
tar xfz [...]]]></description>
			<content:encoded><![CDATA[<p>O Memcached foi desenvolvido pela Danga Interactive para<br />
atender ao livejournal.com um<br />
site com mais de 20 milhões de acessos dinâmicos por dia.<br />
Hoje ele é distribuido sob a permissive free software license e pode<br />
ser baixado em <a href="http://danga.com/memcached/dist/" target="_blank">http://danga.com/memcached/dist/</a></p>
<p><strong>Pre-requisito</strong></p>
<p>O Memcached utiliza a libevent, e caso seu sistma não possua esta biblioteca<br />
você poderá baixa-la em <a href="http://www.monkey.org/~provos/libevent-1.4.8-stable.tar.gz">http://www.monkey.org/~provos/libevent-1.4.8-stable.tar.gz</a><br />
e seguir os passos:</p>
<p>tar xfz libevent-1.4.8-stable.tar.gz<br />
./configure &amp;&amp; make &amp;&amp; sudo make install<br />
sudo ln -s /usr/local/lib/libevent-1.4.so.2 /usr/lib<br />
<strong>Instalando o Memcached</strong></p>
<p>wget <a href="http://danga.com/memcached/dist/memcached-1.2.6.tar.gz" target="_blank">http://danga.com/memcached/dist/memcached-1.2.6.tar.gz</a><br />
tar xfz memcached-1.2.6.tar.gz<br />
cd memcached-1.2.6<br />
./configure &amp;&amp; make &amp;&amp; sudo make install</p>
<p><strong><em>OBS: O utilitário apt-get faz a instalação do memcached e da dependência libevent.<br />
O comando é o sudo apt-get install memcached</em></strong></p>
<p>Agora vamos roda-lo:<br />
# (d = daemon, m = memory, u = user, l = IP to listen to, p = port)<br />
memcached -d -m 1024 -u root -l 127.0.0.1 -p 11211<br />
verifique se ele está ouvindo na porta definida acima:<br />
netstat -a | grep 11211</p>
<p><strong>Suporte a linguagens</strong></p>
<p>O memcached possui clients-api para:</p>
<p>- C/C++<br />
- Erlang<br />
- PHP<br />
- Perl<br />
- Java<br />
- Phyton<br />
- Ruby<br />
- .NET<br />
- MySQL<br />
e outras <a href="http://code.google.com/p/memcached/wiki/Clients">http://code.google.com/p/memcached/wiki/Clients</a></p>
<p>Escolhi como exemplo o Ruby e o PHP e em ambos clients-api a &#8220;serialização&#8221; dos objetos é automática.</p>
<p><strong>Memcached &amp; PHP</strong></p>
<p>apt-get install php5-memcache</p>
<p>verifique se a linha<br />
extension=memcache.so não está comentada no arquivo /etc/php5/conf.d/memcache.ini</p>
<p>agora é só reiniciar o apache<br />
/etc/init.d/apache2 restart</p>
<p>Fiz um código simples para acessar uma base de dados e retornar uma coleção da classe Pessoa:</p>
<p><em>teste.php</em></p>
<p>&lt;?php</p>
<p>require &#8220;persistence/Entity.class.php&#8221;;</p>
<p>class Pessoa extends Entity {<br />
 public $nome;<br />
 public $endereco;<br />
 public function to_string() {<br />
  echo $this-&gt;nome.&#8221; - &#8220;.$this-&gt;endereco;<br />
 }<br />
}</p>
<p>$memcache=new Memcache;<br />
$memcache-&gt;connect(&#8217;localhost&#8217;, 11211) or die(&#8217;Oops!&#8217;);</p>
<p>$pessoas = $memcache-&gt;get(&#8217;key&#8217;);</p>
<p>if (!$pessoas) {<br />
 $pessoas = Pessoa::findAll(&#8221;nome&#8221;);<br />
 $memcache-&gt;set(&#8217;key&#8217;,$pessoas,false,60);<br />
}</p>
<p>print_r($pessoas);</p>
<p>?&gt;</p>
<p> <br />
<strong>Ruby</strong></p>
<p>sudo gem install Ruby-MemCache</p>
<p>Este exemplo em Ruby exibe outros recursos do Memcache como compressão de dados, debug e restrição de escrita.</p>
<p><em>teste.rb</em></p>
<p>require &#8220;rubygems&#8221;<br />
require &#8220;memcache&#8221;<br />
require &#8220;persistence.rb&#8221;</p>
<p>class Pessoa<br />
 attr_accessor :nome, :endereco<br />
 def to_s<br />
  puts &#8220;#{nome} - #{endereco}&#8221;<br />
 end<br />
end</p>
<p>memcache_options = {<br />
   :compression =&gt; true,<br />
   :debug =&gt; false,<br />
   :namespace =&gt; &#8220;mem-teste&#8221;,<br />
   :readonly =&gt; false,<br />
   :urlencode =&gt; false<br />
}</p>
<p>memcache_servers = [ '127.0.0.1:11211' ]</p>
<p>CACHE = MemCache::new(memcache_options)<br />
CACHE.servers = memcache_servers</p>
<p>pessoas = CACHE["key"]</p>
<p>if !pessoas<br />
 pessoas = Persistence::findAll(&#8221;pessoas&#8221;, &#8220;nome&#8221;)<br />
 CACHE["key"] = pessoas<br />
end</p>
<p>puts pessoas</p>
<p>Das ist! um poderoso cache em minutos. <img src='http://www.arnaldonascimento.com/tech/wordpress/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.arnaldonascimento.com/tech/wordpress/?feed=rss2&amp;p=121</wfw:commentRss>
		</item>
		<item>
		<title>Monitoramento e gerência de processos no servidor</title>
		<link>http://www.arnaldonascimento.com/tech/wordpress/?p=109</link>
		<comments>http://www.arnaldonascimento.com/tech/wordpress/?p=109#comments</comments>
		<pubDate>Fri, 11 Sep 2009 20:13:39 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[Failover]]></category>

		<category><![CDATA[apache]]></category>

		<category><![CDATA[linux]]></category>

		<category><![CDATA[monit]]></category>

		<category><![CDATA[monitoramento]]></category>

		<category><![CDATA[processos]]></category>

		<guid isPermaLink="false">http://www.arnaldonascimento.com/tech/wordpress/?p=109</guid>
		<description><![CDATA[Vários são os serviços disponibilizados por um servidor: e-mail, http, database&#8230;. e todos sujeitos a falhas ou a um mal funcionamento que pode comprometer outros sistemas e na pior hipótese toda máquina.
É preciso então que estes sistemas sejam monitorados e em caso de falha ou mal funcionamento que os
administradores sejam notificados.
Neste post vou apresentar como [...]]]></description>
			<content:encoded><![CDATA[<p>Vários são os serviços disponibilizados por um servidor: e-mail, http, database&#8230;. e todos sujeitos a falhas ou a um mal funcionamento que pode comprometer outros sistemas e na pior hipótese toda máquina.<br />
É preciso então que estes sistemas sejam monitorados e em caso de falha ou mal funcionamento que os<br />
administradores sejam notificados.<br />
Neste post vou apresentar como isso pode ser facilmente configurado através do Monit.</p>
<p>O Monit é um utilitário UNIX de monitoração e gerência de processos. Ele é capaz de<br />
 identificar que um processo (serviço, sistema&#8230;) caiu ou se está consumindo memória ou cpu excessivamente.<br />
Quando identifica uma situação anormal o Monit notifica os administradores e restaura o processo.<br />
Existem também recursos de monitoramento de arquivos, diretórios e sistema de arquivos que não serão abordados neste post,<br />
mas que são muito úteis.</p>
<p>O site do Monit é o <a href="http://mmonit.com/monit/" target="_blank">http://mmonit.com/monit/</a></p>
<p><strong>Instalação</strong></p>
<p>Neste exemplo vamos monitorar o funcionamento do apache (obs: o Monit pode ser configurado para monitorar vários processos)</p>
<p>Faça o download do arquivo e descompacte-o:</p>
<p> tar zxvf monit-x.y.z.tar.gz<br />
 cd monit-x.y.z</p>
<p>Execute o ./configure e verifique se todas as dependências estão instaladas no seu Linux.</p>
<p>Se estiver tudo ok entao: make &amp;&amp; make install</p>
<p>O Monit é instalado no /usr/local/bin e o arquivo de configuração monitrc eu criarei no /etc<br />
<strong>Configuração</strong><br />
<em>extraído do original </em><a href="p://mmonit.com/monit/documentation/monit.pdf" target="_blank"><em>http://mmonit.com/monit/documentation/monit.pdf</em></a></p>
<p>(1) # Monit control file<br />
(2)<br />
(3) set daemon 60<br />
(4) set logfile syslog facility LOG_daemon<br />
(5) set mailserver mail.meuserver.com<br />
(6) set alert <a href="mailto:sysadm@meuserver.com">sysadm@meuserver.com</a><br />
(7) set httpd port 2812 address localhost<br />
(8) allow localhost<br />
(9) allow admin:monit<br />
(10)<br />
(11) check process apache with pidfile &#8220;/var/run/apache2.pid&#8221;<br />
(12) start = “/etc/init.d/apache2 start&#8221;<br />
(13) stop = &#8220;/etc/init.d/apache2 stop&#8221;<br />
(14) if failed port 80 and protocol http<br />
(15) and request &#8220;/index.html&#8221; then restart<br />
(16) if cpu usage is greater than 60 percent for 2 cycles then alert<br />
(17) if cpu usage &gt; 98% for 5 cycles then restart<br />
(18) if 2 restarts within 3 cycles then timeout<br />
(19) alert <a href="mailto:foo@meuserver.com">foo@meuserver.com</a><br />
A linha é apenas um comentário. Na linha 3, o monit é configurado para iniciar no modo dæmon e verificar cada serviço em<br />
ciclos de 1 minuto (valor em segundos). na linha 4 , o monit informa que o  log de erros e as mensagens de status utilizarao o  syslog.<br />
O Monit precisa de um servidor SMTP server para enviar as mensagens de alerta, e na linha 5 especificamos<br />
o endereço do SMTP server que o monit deve usar. A linha 6 define o e-mail que receberá os alertas <a href="mailto:sysadm@meuserver.com">sysadm@meuserver.com</a><br />
A linha 7 inicia o servidor http próprio do monit. Este servidor HTTP será acessado para visualizar a interface de monitoramento e gerência (fig. 1 e fig. 2)<br />
A linha 8 define que o servidor http dele poderá ser acessado apenas de localhost<br />
e a linha 9 adiciona um usuário/senha para que o o servidor http do monit possa ser acessado via<br />
HTTP Basic Authentication</p>
<p><em>Informações sobre o processo a ser monitorado</em></p>
<p>A linha 11 informa qual processo vamos monitorar, ela contém um identificador para o processo e o caminho para o pidfile dele.<br />
Se desejamos que o monit inicie, pare ou reinicie um processo devemos configurar os comandos start e stop.<br />
As linhas 12-13 definem os comandos para parar e iniciar o apache.<br />
Na linha 4 configuramos o monit para estabelecer uma conexao com o servidor apache e solicitar o arquivo index.html<br />
Se este teste falhar, monit irá reiniciar o processo do apache.<br />
Nas linhas 16-17 o processo é testado quanto ao uso dos recursos de cpu da máquina e executa as tarefas necessárias de alerta ou reiniciar.<br />
Finalizando o e-mail para onde o monit enviará e-mails caso o serviço configurado falhe.<br />
O ideal é que o monit inicie junto com o linux, mas para testar você pode iniciá-lo simplesmente chamndo: monit e para para-lo: monit quit<br />
É prudente antes de iniciá-lo executar monit -t para verificar se não existem erros na configuração do monitrc.</p>
<p><a href="http://www.arnaldonascimento.com/imgs/1.jpg"><img class="aligncenter" title="Monit" src="http://www.arnaldonascimento.com/imgs/1.jpg" alt="" width="376" height="214" /></a></p>
<p style="text-align: left;"><a href="http://www.arnaldonascimento.com/imgs/2.jpg"><img class="aligncenter" title="2" src="http://www.arnaldonascimento.com/imgs/2.jpg" alt="" width="379" height="247" /></a></p>
<p>Até apróxima <img src='http://www.arnaldonascimento.com/tech/wordpress/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.arnaldonascimento.com/tech/wordpress/?feed=rss2&amp;p=109</wfw:commentRss>
		</item>
		<item>
		<title>Whippet CodGen for PHP</title>
		<link>http://www.arnaldonascimento.com/tech/wordpress/?p=107</link>
		<comments>http://www.arnaldonascimento.com/tech/wordpress/?p=107#comments</comments>
		<pubDate>Fri, 04 Sep 2009 13:37:12 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[Whippet CodGen for PHP]]></category>

		<category><![CDATA[code generator]]></category>

		<category><![CDATA[codgen]]></category>

		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.arnaldonascimento.com/tech/wordpress/?p=107</guid>
		<description><![CDATA[Iniciei um projeto de geração de código PHP e no momento estou trabalhando na interface de geração. No source forge já postei o framework de persistência.Mas, o projeto ainda não tem um release  e está em desenvolvimento.
http://sourceforge.net/projects/whippetcodgen/
]]></description>
			<content:encoded><![CDATA[<p>Iniciei um projeto de geração de código PHP e no momento estou trabalhando na interface de geração. No source forge já postei o framework de persistência.Mas, o projeto ainda não tem um release  e está em desenvolvimento.</p>
<p><a href="http://sourceforge.net/projects/whippetcodgen/">http://sourceforge.net/projects/whippetcodgen/</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.arnaldonascimento.com/tech/wordpress/?feed=rss2&amp;p=107</wfw:commentRss>
		</item>
		<item>
		<title>Balanceamento de Carga com PHP - Parte II</title>
		<link>http://www.arnaldonascimento.com/tech/wordpress/?p=81</link>
		<comments>http://www.arnaldonascimento.com/tech/wordpress/?p=81#comments</comments>
		<pubDate>Wed, 19 Aug 2009 21:08:32 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[Clustering]]></category>

		<category><![CDATA[PHP]]></category>

		<category><![CDATA[apache]]></category>

		<category><![CDATA[balanceamento de carga]]></category>

		<category><![CDATA[cluster]]></category>

		<category><![CDATA[mod_proxy_balancer]]></category>

		<guid isPermaLink="false">http://www.arnaldonascimento.com/tech/wordpress/?p=81</guid>
		<description><![CDATA[Esse tipo de cluster tem como função controlar a distribuição equilibrada do processamento.
Requer um monitoramento constante na sua comunicação e em seus mecanismos de redundância,
pois se ocorrer alguma falha haverá uma interrupção no seu funcionamento. Wikipédia
Vou assumir que já temos duas máquinas rodando a aplicação criada no passo I e devidamente configuradas para gravar
as sessões [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Esse tipo de cluster tem como função controlar a distribuição equilibrada do processamento.<br />
Requer um monitoramento constante na sua comunicação e em seus mecanismos de redundância,<br />
pois se ocorrer alguma falha haverá uma interrupção no seu funcionamento.</strong> <em><a href="http://pt.wikipedia.org/wiki/Balanceamento_de_carga" target="_blank">Wikipédia</a></em></p>
<p>Vou assumir que já temos duas máquinas rodando a aplicação criada no passo I e devidamente configuradas para gravar<br />
as sessões em um terceiro servidor, o banco de dados.<br />
Estas máquinas podem ser configuradas com qualquer sistema operacional que suporte um servidor web com PHP<br />
Para o servidor responsável pelo balanceamento de carga eu utilizo o Linux, e neste exemplo o Ubuntu Linux.</p>
<p>Bom, selecionei duas formas de balanceamento para exemplificar: por DNS e por Proxy.<br />
Para o DNS vamos usar o software BIND9 e para o Proxy o Apache + mod_proxy_balancer<br />
A tarefa destes softwares é receber as requisições e dividi-las entre os dois servidores PHP utilizando o algorítimo<br />
mais simples de balancemento: o Round Robin.<br />
Round Robin divide as requisições de forma igual, uma para o servidor A - outra pro servidor B,<br />
sem levar em consideração se A já está executando muitas tarefas ou se B está com consumo muito alto de CPU e etc&#8230;<br />
Existe vários tipos de algorítimos e o melhor deve ser escolhido após um estudo aprofundado que leve em consideração<br />
o número de máquinas disponíveis para balanceamento e suas configurações de memória, CPU, link de rede, número de sistemas instalados&#8230;</p>
<p><strong>Balanceamento por DNS</strong></p>
<p>Para instalar o BIND9 no Ubuntu basta digitar a linha abaixo<br />
<strong><em>sudo apt-get install bind9</em></strong></p>
<p>Após a instalação, o servidor já está configurado para ser um servidor de DNS e ouvindo na porta 53.<br />
O próximo passo é configurá-lo de forma que as requisições para o domínio www.exemplo.com.br<br />
sejam redirecionadas para as máquinas com o PHP.</p>
<p>Criaremos então o arquivo <strong>/etc/bind/db.exemplo</strong></p>
<blockquote><p>$TTL 0<br />
IN SOA dns1.exemplo.com.br. email.exemplo.com.br. (<br />
2 ; Serial<br />
604800 ; Refresh<br />
86400 ; Retry<br />
2419200 ; Expire<br />
604800 ) ; Negative Cache TTL<br />
;<br />
IN MX 10 mail</p>
<p>mail IN A 192.168.56.107</p>
<p>www IN A 192.168.56.101<br />
IN A 192.168.56.103</p></blockquote>
<p>Note que em www eu adicionei os IPs dos servidores que vão rodar a aplicação PHP, isso já faz com que o BIND use o Round Robin<br />
para balancear as requisições.</p>
<p>E agora adicionamos uma referência ao <strong>db.exemplo</strong> no arquivo <strong>/etc/bind/named.conf</strong></p>
<blockquote><p>zone &#8220;localhost&#8221; {<br />
type master;<br />
file &#8220;/etc/bind/db.local&#8221;;<br />
};</p>
<p>zone &#8220;127.in-addr.arpa&#8221; {<br />
type master;<br />
file &#8220;/etc/bind/db.127&#8243;;<br />
};</p>
<p>zone &#8220;0.in-addr.arpa&#8221; {<br />
type master;<br />
file &#8220;/etc/bind/db.0&#8243;;<br />
};</p>
<p>zone &#8220;255.in-addr.arpa&#8221; {<br />
type master;<br />
file &#8220;/etc/bind/db.255&#8243;;<br />
};</p>
<p>zone &#8220;exemplo.com.br&#8221; {<br />
type master;<br />
file &#8220;/etc/bind/db.exemplo&#8221;;<br />
};</p>
<p>include &#8220;/etc/bind/named.conf.local&#8221;;</p></blockquote>
<p>Reinicie o serviço com a linha abaixo:<br />
<em><strong>sudo /etc/init.d/bin9 restart</strong></em></p>
<p>É interessante neste momento alterar uma linha do arquivo teste.php para melhor visualização do balanceamento:</p>
<blockquote><p>Servidor A: $_SESSION['server']= &#8220;server 1&#8243;;</p>
<p>Servidor B: $_SESSION['server']= &#8220;server 2&#8243;;</p></blockquote>
<p>Hora de testar: abra a URL http://www.exemplo.com.br/teste.php com o browser e veja o resultado do balanceamento.</p>
<p><strong>Balanceamento via Proxy</strong></p>
<p>O Apache2 possui um módulo chamado mod_proxy_balancer. Ele é uma extensão do mod_proxy, que portanto também deve estar presente<br />
na configuração do balanceamento de carga. O proxy balancer suporta os protocolos HTTP, FTP e AJ13.</p>
<p>Para quem não possui o apache2 instalado pode instalar a partir da linha abaixo:<br />
<strong><em>sudo apt-get install apache2</em></strong></p>
<p>Para instalar o mod_proxy_balance devemos copiar os arquivos do diretório <strong>/etc/apache2/mods-available</strong></p>
<blockquote><p>proxy_balancer.load<br />
proxy.load<br />
proxy.conf<br />
proxy_http.load</p></blockquote>
<p>para o diretório:<br />
<strong>/etc/apache2/mods-enabled</strong></p>
<p>Vamos agora configurar o módulo para operar no modo <strong><em>reverse proxy</em></strong> (ou gateway). Neste modo a requisição chega ao servidor proxy que decide quem a atenderá, e retorna o resultado ao cliente origem.<br />
Para isso alteramos no arquivo <strong><em>proxy.conf  </em>a </strong>diretiva <strong>ProxyRequests</strong> para o valor <strong>off</strong>.</p>
<p>Segue abaixo um exemplo de como deve ficar o  arquivo <strong>proxy.load</strong></p>
<blockquote><p>&lt;IfModule mod_proxy.c&gt;<br />
         ProxyRequests Off</p>
<p>        &lt;Proxy *&gt;<br />
                AddDefaultCharset off<br />
                Order deny,allow<br />
           Allow from all #Isso é apenas um exemplo, configure seu proxy com segurança!!!!<br />
        &lt;/Proxy&gt;</p>
<p> &lt;Proxy balancer://meucluster&gt;<br />
  BalancerMember <a href="http://192.168.56.103:80">http://192.168.56.103:80</a> #Servidor PHP A<br />
  BalancerMember <a href="http://192.168.56.102:80">http://192.168.56.102:80</a> #Servidor PHP B<br />
 &lt;/Proxy&gt;<br />
 ProxyPass /teste balancer://meucluster<br />
&lt;/IfModule&gt;</p>
<p> </p></blockquote>
<p>Reinicie o Apache:<br />
<strong><em>sudo /etc/init.d/apache2 restart</em></strong></p>
<p>Neste exemplo meu servidor proxy atende pela URL www.appteste.com.br e redireciona para os IPs 192.168.56.103 e 192.168.56.102 que estão rodando a aplicação de teste.<br />
Hora de testar: abra a URL http://www.appteste.com.br/teste/teste.php com o browser e veja o resultado do balanceamento.</p>
<p>Bom, acho que consegui passar uma visão de como podemos configurar um balanceamento com PHP. O assunto, claro,<br />
não para por aqui. Existem inúmeras outras situações, configurações, problemas, soluções, algorítimos&#8230; Mas, um problema que fica claro na solução acima é o fato do load balancer se tornar mais um <strong>ponto de falha</strong> na arquitetura. Basta imaginar que se ele cair, todo trabalho está perdido e será um assunto que quero tratar nos próximos posts.<br />
Valeu!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.arnaldonascimento.com/tech/wordpress/?feed=rss2&amp;p=81</wfw:commentRss>
		</item>
		<item>
		<title>Balanceamento de Carga com PHP - Parte I</title>
		<link>http://www.arnaldonascimento.com/tech/wordpress/?p=64</link>
		<comments>http://www.arnaldonascimento.com/tech/wordpress/?p=64#comments</comments>
		<pubDate>Tue, 18 Aug 2009 20:45:45 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[Clustering]]></category>

		<category><![CDATA[PHP]]></category>

		<category><![CDATA[balanceamento de carga]]></category>

		<category><![CDATA[cluster]]></category>

		<category><![CDATA[mysql]]></category>

		<category><![CDATA[persistência]]></category>

		<category><![CDATA[sessões]]></category>

		<guid isPermaLink="false">http://www.arnaldonascimento.com/tech/wordpress/?p=64</guid>
		<description><![CDATA[Empresas que possuem um número alto de requisições em seus servidores ou que precisam de alta-disponibilidade em seus sistemas, adotam soluções de cluster adaptadas as sua realidade. Dos três tipos conhecidos (Alto Desempenho, Alta Disponibilidade e Balanceamento de Carga) vou tentar passar as configurações básicas para o Balanceamento de Carga para PHP.
As configurações que vou [...]]]></description>
			<content:encoded><![CDATA[<p>Empresas que possuem um número alto de requisições em seus servidores ou que precisam de <a href="http://pt.wikipedia.org/wiki/Sistema_de_alta_disponibilidade" target="_blank">alta-disponibilidade </a>em seus sistemas, adotam soluções de <a href="http://pt.wikipedia.org/wiki/Cluster" target="_blank">cluster </a>adaptadas as sua realidade. Dos três tipos conhecidos <a href="http://pt.wikipedia.org/wiki/Tipos_de_cluster" target="_blank">(Alto Desempenho, Alta Disponibilidade e Balanceamento de Carga) </a>vou tentar passar as configurações básicas para o Balanceamento de Carga para PHP.<br />
As configurações que vou apresentar podem ser aplicadas em máquinas físicas ou em um ambiente <a href="http://pt.wikipedia.org/wiki/Virtualiza%C3%A7%C3%A3o" target="_blank">virtualizado</a>.</p>
<p>O primeiro problema a ser resolvido é o das sessões. O PHP por padrão salva os dados de sessões em arquivos dentro<br />
de um diretório local. Em um cluster configurado para balanceamento de carga o PHP então não saberia encontrar os dados da sessão de um usuário ou qual foi o ID criado para ele e etc&#8230; Pois, cada máquina, teria seu próprio gerenciador de sessões.<br />
Existem algumas soluções para este problema e a que vou apresentar aqui é a persistência de sessões em banco de dados. Um ponto único de gravação e leitura de sessões com o suporte  da transação gerenciada pelo banco.<br />
O banco de dados utilizado aqui será o MySQL, mas o código PHP necessário para o gerenciamento<br />
de sessões pode ser facilmente migrado para qualquer outro banco. Uma boa prática é usar o PDO como camada de<br />
acesso ao banco.</p>
<p>Vamos ao código, o PHP permite alterar o gerenciamento de sessões através da função s<a href="http://us2.php.net/manual/en/function.session-set-save-handler.php" target="_blank">ession_set_save_handler </a>.<br />
Esta função espera seis funções de callback como parâmetro que são:</p>
<blockquote><p>open<br />
close<br />
read<br />
write<br />
destroy<br />
gc</p></blockquote>
<p>Então o primeiro passo é definir a classe session que implementará estes métodos:</p>
<p><strong>session.class.php</strong></p>
<p>&lt;?php</p>
<p>class session {<br />
    var $life_time;<br />
    var $connection;<br />
   <br />
    function session($connection) {<br />
        $this-&gt;connection = $connection;<br />
        $this-&gt;life_time = get_cfg_var(&#8221;session.gc_maxlifetime&#8221;);<br />
        //Olha session_set_save_handler aqui!!!<br />
        session_set_save_handler(<br />
            array( &amp;$this, &#8220;open&#8221; ),<br />
            array( &amp;$this, &#8220;close&#8221; ),<br />
            array( &amp;$this, &#8220;read&#8221; ),<br />
            array( &amp;$this, &#8220;write&#8221;),<br />
            array( &amp;$this, &#8220;destroy&#8221;),<br />
            array( &amp;$this, &#8220;gc&#8221; )<br />
        );<br />
    }</p>
<p>    function open( $save_path, $session_name ) {<br />
        global $sess_save_path;<br />
        $sess_save_path = $save_path;     <br />
        return true;<br />
    }</p>
<p>    function close() {<br />
        return true;<br />
    }</p>
<p>    function read( $id ) {<br />
        $num_rows = 0;<br />
        $data = &#8221;;<br />
        $time = time();<br />
        $newid = mysql_real_escape_string($id); //prefira PDO e bindParams ao mysql_real_escape_string<br />
        $result =mysql_query(&#8221;SELECT `session_data` FROM `sessions` WHERE `session_id` = &#8220;.$newid.&#8221; AND `expires` &gt; &#8220;.$time, $this-&gt;connection);<br />
        if ($result) {<br />
            $num_rows = mysql_num_rows($result,$this-&gt;connection);</p>
<p>            if($num_rows  &gt; 0) {<br />
                $row = mysql_fetch_array($result);<br />
                $data = $row['session_data'];<br />
            }<br />
        }<br />
        return $data;<br />
    }<br />
    function write( $id, $data ) {    <br />
        $time = time() + $this-&gt;life_time;<br />
        $newid = mysql_real_escape_string($id);     //prefira PDO e bindParams ao mysql_real_escape_string<br />
        $newdata = mysql_real_escape_string($data);<br />
        $sql = &#8220;REPLACE `sessions` (`session_id`,`session_data`,`expires`) VALUES(&#8217;$newid&#8217;, &#8216;$newdata&#8217;, $time)&#8221;;<br />
        $rs = mysql_query($sql,$this-&gt;connection);<br />
        return true;<br />
    }</p>
<p>    function destroy( $id ) {     <br />
        $newid = mysql_real_escape_string($id);<br />
        $sql = &#8220;DELETE FROM `sessions` WHERE `session_id` = &#8216;$newid&#8217;&#8221;;<br />
         mysql_query($sql, $this-&gt;connection);<br />
        return true;<br />
    }</p>
<p>    function gc() {<br />
        $sql = &#8216;DELETE FROM `sessions` WHERE `expires` &lt; UNIX_TIMESTAMP();&#8217;;<br />
        mysql_query($sql,$this-&gt;connection);     <br />
        return true; //Sempre retorna true<br />
    }<br />
}<br />
?&gt;</p>
<p>Agora vamos criar uma página para testes:</p>
<p><strong>teste.php</strong></p>
<p>&lt;?php</p>
<p>require_once(&#8221;session.class.php&#8221;);</p>
<p>$connection = mysql_connect(&#8221;192.168.56.1&#8243;,&#8221;root&#8221;,&#8221;");<br />
mysql_select_db(&#8221;sessions&#8221;, $connection) or die( &#8220;Erro ao selecionar a base de dados&#8221;);</p>
<p>$session = new session($connection);</p>
<p>session_start();<br />
$_SESSION['time']= date(&#8221;H:i:s&#8221;);<br />
$_SESSION['server']= &#8220;server 1&#8243;;<br />
print_r($_SESSION);</p>
<p>?&gt;<br />
E por fim a tabela que irá armazenar os dados das sessões:</p>
<p>CREATE TABLE IF NOT EXISTS `sessions` (<br />
  `session_id` varchar(100) NOT NULL DEFAULT &#8221;,<br />
  `session_data` text NOT NULL,<br />
  `expires` int(11) NOT NULL DEFAULT &#8216;0&#8242;,<br />
  PRIMARY KEY (`session_id`)<br />
) ENGINE=InnoDB DEFAULT CHARSET=latin1;<br />
Rode a aplicação e veja o resultado gravado na tabela.<br />
E agora que já temos toda parte de sessão resolvida vamos para a segunda parte: <strong>as configurações de balanceamento</strong>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.arnaldonascimento.com/tech/wordpress/?feed=rss2&amp;p=64</wfw:commentRss>
		</item>
		<item>
		<title>Instalando WebSphere 6.1 no Ubuntu</title>
		<link>http://www.arnaldonascimento.com/tech/wordpress/?p=35</link>
		<comments>http://www.arnaldonascimento.com/tech/wordpress/?p=35#comments</comments>
		<pubDate>Thu, 16 Jul 2009 20:09:57 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[Application Server]]></category>

		<category><![CDATA[ubuntu]]></category>

		<category><![CDATA[WebSphere]]></category>

		<guid isPermaLink="false">http://www.arnaldonascimento.com/tech/wordpress/?p=35</guid>
		<description><![CDATA[Minha primeira tentativa de instalar o WAS 6.1 no Ubuntu Linux foi desastrosa. Mas, após pesquisar eu identifiquei que o /bin/sh no Ubuntu é um link para o dash e o instalador só funcionará corretamente se apontar para bash. Isso pode ser resolvido com o comando sudo unlink /bin/sh seguido do sudo ln -s /bin/bash [...]]]></description>
			<content:encoded><![CDATA[<p>Minha primeira tentativa de instalar o WAS 6.1 no Ubuntu Linux foi desastrosa. Mas, após pesquisar eu identifiquei que o /bin/sh no Ubuntu é um link para o <strong>dash</strong> e o instalador só funcionará corretamente se apontar para <strong>bash</strong>. Isso pode ser resolvido com o comando <strong>sudo unlink /bin/sh</strong> seguido do <strong>sudo ln -s /bin/bash /bin/sh</strong></br><br />
Agora baixe/atualize as bibliotecas abaixo:</p>
<blockquote><p>apt-get -y install libstdc++5<br />
apt-get -y install mc<br />
apt-get -y install unzip
</p></blockquote>
<p>O próximo passo é verificar no arquivo WAS/responsefile.base.txt se o parâmetro <em>-OPT installLocation</em> é um diretório válido no Linux. Por padrão a distribuição que baixei vem com o valor &#8220;c:\IBM\WebSphere\AppServ&#8221; </br></p>
<p>Agora é só executar o instalador: <strong>sudo WAS/install -options responsefile.base.txt</strong> e é isso ae <img src='http://www.arnaldonascimento.com/tech/wordpress/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.arnaldonascimento.com/tech/wordpress/?feed=rss2&amp;p=35</wfw:commentRss>
		</item>
	</channel>
</rss>
