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

<channel>
	<title>Fernando Softov</title>
	<atom:link href="http://www.softov.com.br/blog/feed" rel="self" type="application/rss+xml" />
	<link>http://www.softov.com.br/blog</link>
	<description>Só mais um blog do WordPress</description>
	<lastBuildDate>Wed, 01 Sep 2010 04:41:42 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>Desenvolvimento Web na Prática 02 &#8211; Iniciando com PHP</title>
		<link>http://www.softov.com.br/blog/post/124/desenvolvimento-web-na-pratica-02-iniciando-com-php</link>
		<comments>http://www.softov.com.br/blog/post/124/desenvolvimento-web-na-pratica-02-iniciando-com-php#comments</comments>
		<pubDate>Wed, 01 Sep 2010 04:41:42 +0000</pubDate>
		<dc:creator>fernandosoftov</dc:creator>
				<category><![CDATA[Dicas]]></category>
		<category><![CDATA[Video Aulas]]></category>
		<category><![CDATA[desenvolvimento web]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://www.softov.com.br/blog/?p=124</guid>
		<description><![CDATA[Bem galera, demorou mas está ai, para começar um pequena introdução sobre o php. Bom, eu cortei o vídeo em 3 partes por causa do you tube, mas os próximo vídeos terã 15 minutos e abordarei somente um tema. Estarei postando também alguns artigos e tutoriais em forma de texto. Quando eu fizer algum vídeo [...]]]></description>
			<content:encoded><![CDATA[<p>Bem galera, demorou mas está ai, para começar um pequena introdução sobre o php.</p>
<p>Bom, eu cortei o vídeo em 3 partes por causa do you tube, mas os próximo vídeos terã 15 minutos e abordarei somente um tema.</p>
<p>Estarei postando também alguns artigos e tutoriais em forma de texto.</p>
<p>Quando eu fizer algum vídeo que tenha exemplos, colocarei o download dos demos no final do post. Espero que gostem e até o próximo post!</p>
<p>Parte 01</p>
<p><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="425" height="350" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="src" value="http://www.youtube.com/v/I21uQ31M-mI" /><embed type="application/x-shockwave-flash" width="425" height="350" src="http://www.youtube.com/v/I21uQ31M-mI"></embed></object></p>
<p>Parte 02</p>
<p><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="425" height="350" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="src" value="http://www.youtube.com/v/e384R1ghe9M" /><embed type="application/x-shockwave-flash" width="425" height="350" src="http://www.youtube.com/v/e384R1ghe9M"></embed></object></p>
<p>Parte 03</p>
<p><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="425" height="350" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="src" value="http://www.youtube.com/v/xNf9VQtcIyw" /><embed type="application/x-shockwave-flash" width="425" height="350" src="http://www.youtube.com/v/xNf9VQtcIyw"></embed></object></p>
<p>&#8230; até mais pessoal</p>
]]></content:encoded>
			<wfw:commentRss>http://www.softov.com.br/blog/post/124/desenvolvimento-web-na-pratica-02-iniciando-com-php/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Desenvolvimento Web na Prática &#8211; Introdução</title>
		<link>http://www.softov.com.br/blog/post/122/desenvolvimento-web-na-pratica-introducao</link>
		<comments>http://www.softov.com.br/blog/post/122/desenvolvimento-web-na-pratica-introducao#comments</comments>
		<pubDate>Wed, 21 Jul 2010 02:37:49 +0000</pubDate>
		<dc:creator>fernandosoftov</dc:creator>
				<category><![CDATA[Dicas]]></category>
		<category><![CDATA[Internet]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Video Aulas]]></category>
		<category><![CDATA[desenvolvimento web]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://www.softov.com.br/blog/?p=122</guid>
		<description><![CDATA[Bom galera, minha primeira esta é uma introdução das minhas Vídeo  Aulas sobre Desenvolvimento Web, espero que gostem, ainda não falei sobre nada, mas em breve teremos muito conteúdo. Estarei falando sobre o PHP (OO), framwork ZEND, a biblioteca  jquery, css, xhtml, html, xml, e outros assuntos relativos ao desenvolvimento web. Sugestões sobre assuntos, mandem [...]]]></description>
			<content:encoded><![CDATA[<p>Bom galera, minha primeira esta é uma introdução das minhas Vídeo  Aulas sobre Desenvolvimento Web, espero que gostem, ainda não falei sobre nada, mas em breve teremos  muito conteúdo.</p>
<p>Estarei falando sobre o PHP (OO), framwork ZEND, a biblioteca  jquery, css,  xhtml, html, xml, e outros assuntos relativos ao desenvolvimento web.</p>
<p>Sugestões sobre assuntos, mandem por comentários ou e-mail.</p>
<p><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="425" height="344" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowFullScreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="src" value="http://www.youtube.com/v/gFsBxlQZKK0&amp;hl=pt_BR&amp;fs=1?rel=0&amp;color1=0x3a3a3a&amp;color2=0x999999" /><param name="allowfullscreen" value="true" /><embed type="application/x-shockwave-flash" width="425" height="344" src="http://www.youtube.com/v/gFsBxlQZKK0&amp;hl=pt_BR&amp;fs=1?rel=0&amp;color1=0x3a3a3a&amp;color2=0x999999" allowscriptaccess="always" allowfullscreen="true"></embed></object></p>
]]></content:encoded>
			<wfw:commentRss>http://www.softov.com.br/blog/post/122/desenvolvimento-web-na-pratica-introducao/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Introducao a Web Semantica</title>
		<link>http://www.softov.com.br/blog/post/113/introducao-a-web-semantica</link>
		<comments>http://www.softov.com.br/blog/post/113/introducao-a-web-semantica#comments</comments>
		<pubDate>Wed, 17 Mar 2010 14:47:49 +0000</pubDate>
		<dc:creator>fernandosoftov</dc:creator>
				<category><![CDATA[Internet]]></category>
		<category><![CDATA[Dicas]]></category>
		<category><![CDATA[linked data]]></category>
		<category><![CDATA[rdf]]></category>
		<category><![CDATA[rdfa]]></category>
		<category><![CDATA[web semantica]]></category>

		<guid isPermaLink="false">http://www.softov.com.br/blog/?p=113</guid>
		<description><![CDATA[A Web semântica é uma extensão da Web actual, que permitirá aos computadores e humanos trabalharem em cooperação. A Web semântica interliga significados de palavras e, neste âmbito, tem como finalidade conseguir atribuir um significado (sentido) aos conteúdos publicados na Internet de modo que seja perceptível tanto pelo humano como pelo computador. O objectivo principal [...]]]></description>
			<content:encoded><![CDATA[<p>A <strong>Web semântica</strong> é uma extensão da Web actual, que permitirá aos computadores e humanos trabalharem em cooperação.</p>
<p>A Web semântica interliga significados de palavras e, neste âmbito, tem como finalidade conseguir atribuir um significado  (sentido) aos conteúdos publicados na Internet de modo que seja  perceptível tanto pelo humano como pelo computador.</p>
<p>O objectivo principal da Web semântica não é, pelo menos para já,  treinar as máquinas para que se comportem como pessoas, mas sim  desenvolver tecnologias e linguagens que tornem a informação legível  para as máquinas. A finalidade passa pelo desenvolvimento de um modelo  tecnológico que permita a partilha global de conhecimento assistido por  máquinas (W3C 2001). A integração das linguagens ou tecnologias eXtensible Markup  Language (XML),  Resource  Description Framework (RDF), arquiteturas de metadados, ontologias, agentes  computacionais, entre outras, favorecerá o aparecimento de serviços Web  que garantam a interoperabilidade e cooperação.</p>
<p>Bem, procurando pela internet, achei isso:</p>
<object width="470" height="385"><param name="movie" value="http://static.slideshare.net/swf/ssplayer2.swf?doc=cesjfwebsemanticaset09v3-090917095937-phpapp02"/><param name="allowFullScreen" value="true"/><param name="allowScriptAccess" value="always"/><embed src="http://static.slideshare.net/swf/ssplayer2.swf?doc=cesjfwebsemanticaset09v3-090917095937-phpapp02"  type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="470" height="385"></embed></object>
<p>e mais isso:</p>
<object width="470" height="385"><param name="movie" value="http://static.slideshare.net/swf/ssplayer2.swf?doc=web-semantica-v20-1219187779353375-9"/><param name="allowFullScreen" value="true"/><param name="allowScriptAccess" value="always"/><embed src="http://static.slideshare.net/swf/ssplayer2.swf?doc=web-semantica-v20-1219187779353375-9"  type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="470" height="385"></embed></object>
]]></content:encoded>
			<wfw:commentRss>http://www.softov.com.br/blog/post/113/introducao-a-web-semantica/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Classe Abstrata, phpOO + Mysql</title>
		<link>http://www.softov.com.br/blog/post/109/classe-abstrata-phpoo-mysql</link>
		<comments>http://www.softov.com.br/blog/post/109/classe-abstrata-phpoo-mysql#comments</comments>
		<pubDate>Thu, 12 Nov 2009 20:16:48 +0000</pubDate>
		<dc:creator>fernandosoftov</dc:creator>
				<category><![CDATA[desenvolvimento web]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://www.softov.com.br/blog/?p=109</guid>
		<description><![CDATA[Neste tutorial vou mostrar como você pode criar uma classe phpOO abstrata para banco de dados MySQL. Além das funções básicas dessa classe, podemos resumir tempo total gasto com conexão e execução de consultas e contar quantas consultas foram executados durante o seu script PHP. Etapa 1. A primeira pergunta é por isso que precisamos [...]]]></description>
			<content:encoded><![CDATA[<p>Neste tutorial vou mostrar como você pode criar uma classe phpOO abstrata para banco de dados MySQL.<br />
Além das funções básicas dessa classe, podemos resumir tempo total gasto com conexão e execução de consultas e contar quantas consultas foram executados durante o seu script PHP.</p>
<h3>Etapa 1.</h3>
<p>A primeira pergunta é por isso que precisamos se nós temos toda a função em PHP como nativa. Há mais argumentos:</p>
<p>* Você pode facilmente reutilizar o script em todo o seu desenvolvimento.<br />
* Você pode alterar a base de dados sem alterar todo o seu script. Você precisará editar apenas a classe.<br />
* Você pode fazer optimização e simplificação mais fácil.<br />
* Você pode centralizar o acesso e manipulação de erro DB.<br />
* Você pode fazer a depuração mais fácil.<br />
* Você pode fácilmente implementar estatísticas em tempo de consulta e contadores de consulta.</p>
<p>Agora vamos resumir o tipo de função que precisamos:</p>
<p>* Criar uma conexão com o banco<br />
* Execução de queries SQL<br />
* Recebe o número de linhas selecionadas se possível<br />
* Recebe o número de linhas modificadas, se possível<br />
* Receber o id(auto increment) mais recente, se foi possível inserir<br />
* Coloque um resultado da consulta em um array normal<br />
* Mensagem de erro e / ou identificação(code), se necessário<br />
* Obter o tempo total gasto no banco de dados<br />
* Recebe o número de consultas realizadas</p>
<h3>Etapa 2.</h3>
<p>Antes que possamos iniciar a implementação das funções que precisamos de todas as variáveis de classe comum usado que armazena informações importantes.<br />
Estes são:</p>
<p>* Um identificador de conexão para armazenar o link de conexão real.<br />
* Um conjunto de resultados para armazenar resultados da consulta.<br />
* Uma mensagem de erro e erro id para armazenar informações de erro.<br />
* Um contador para contar as consultas executadas.<br />
* Um contador de tempo para armazenar os tempos de consulta total.</p>
<p>Assim, a classe base fica assim:<br />
MysqlAbs.class.php</p>
<pre class="brush: php;">
 &lt;? php

classe MysqlAbs (

 var $conectado   = ''; // link de conexao
 var $queryCounter = 0; // contador de query
 var $tempoTotal    = 0;     // contador de tempo
 var $errorCode    = 0; //codigo de erro
 var $errorMsg     = ''; // mensagem de erro
 var $resultSet    = '';

 // conexao padrao quando nao for setada
 var $servidor=&quot;localhost&quot;; // host
 var $usuario=&quot;root&quot;; // user
 var $senha=&quot;&quot;; //senha
 var $banco=&quot;test&quot;; //banco)
?&gt;
</pre>
<h3>Etapa 3.</h3>
<p>Agora podemos implementar as funções. Vamos começar com o mais importante. Conectando-se ao banco de dados. O construtor da classe será responsável por construir a conexão com a base de dados. Portanto, se você criar um objeto de banco de dados a partir desta classe imediatamente tera uma conexão válida também.</p>
<p>Assim, o construtor tem os seguintes parâmetros:<br />
* Hostname<br />
* Usuário<br />
* Senha<br />
* Nome do banco de dados</p>
<p>Na função tentamos conectar ao servidor de banco de dados e se conseguirmos,  tentamos selecionar o banco de dados. Em caso de erro temos que definir a mensagem de erro e o codigo de erro e retornar como falso.</p>
<p>O construtor da classe é o seguinte:</p>
<pre class="brush: php;">

&lt;? php
 function __construct() {
 $this -&gt; conexao($this-&gt;servidor,$this-&gt;usuario,$this-&gt;senha,$this-&gt;banco);
}
function conexao($host, $user, $pass, $db){
 $startTime = $this-&gt;getMicroTime();

 // faz a conexao com o servidor
 if (!$this-&gt;conectado = @mysql_connect($host,$user,$pass,true)){
 $this-&gt;errorCode = mysql_errno();
 $this-&gt;errorMsg  = mysql_error();
 return false;

 }

 // faz a selecao do banco
 if (!@mysql_select_db($db,$this-&gt;conectado)){
 $this-&gt;errorCode = mysql_errno();
 $this-&gt;errorMsg  = mysql_error();
 @mysql_close($this-&gt;conectado);
 return false;
 }

 $this-&gt;tempoTotal += $this-&gt;getMicroTime() - $startTime;

 return true;
 }

?&gt;
</pre>
<p>Acima eu crio o construct que instanciará a conexao, assim como padrao fica a conexão com os dados que estao dentro da classe, se for instanciado e passado os parametros ele criara a conexao. Caso contrário ele retornará falso com uma mensagem de erro.</p>
<h3>Etapa 4.</h3>
<p>Como próximo passo vamos implementar a função de execução da consulta. Nesta função podemos medir o tempo de execução (veja os detalhes mais tarde), aumentando o contador de consulta e, claro, de executar a consulta em si. Se ocorrer um erro, definir a mensagem de erro e de codigo de erro  e retorna como falso. Se tudo estiver  funcionando voltamos bem com o conjunto de resultados.</p>
<p>O código é o seguinte:</p>
<pre class="brush: php;">

&lt;? php
 function executeQuery($sql){

 $startTime = $this-&gt;getMicroTime();

 ++$this-&gt;queryCounter;

 if(!$this-&gt;resultSet = @mysql_query($sql,$this-&gt;conectado)){
 $this-&gt;errorCode = mysql_errno();
 $this-&gt;errorMsg  = mysql_error();
 $this-&gt;totalTime = $this-&gt;getMicroTime() - $startTime;
 return false;
 }
 $this-&gt;totalTime += $this-&gt;getMicroTime() - $startTime;

 return $this-&gt;resultSet;
 }
?&gt;
</pre>
<p>Se a consulta contém um Insert, Update ou o comando DELETE, pode ser importante para saber quantos registros foram afetados por esta consulta. Para obtê-lo vamos implementar uma função, como segue:</p>
<pre class="brush: php;">

&lt;? php
 function getAffectedRows()
 {
 return @mysql_affected_rows($this-&gt;conectado);
 }
?&gt;
</pre>
<p>No caso de um select,  o número de registros poderia ser interessante. Para obtê-lo, temos uma função semelhante:</p>
<pre class="brush: php;">

&lt;? php
 function getSelectedRows()
 {
 return @mysql_num_rows($this-&gt;resultSet);
 }
?&gt;
</pre>
<p>Neste tópico, temos uma última questão importante. Em caso de Inserção talvez nós queremos saber o id que foi criado. Para obter essa informação após o registro ser inserido, podemos usar o seguinte código:</p>
<pre class="brush: php;">

&lt;? php
 function getInsertId()
{
 return @mysql_insert_id($this-&gt;conectado);
 }
?&gt;
</pre>
<h3>Etapa 5.</h3>
<p>Agora vamos criar alguma outra função útil para tornar a nossa classe melhor.<br />
Em caso de select, por vezes, seria bom ter um array associativo em vez do MySQL result set. Então, vamos implementar uma função que retorna a essa matriz gerada a partir de um conjunto de resultados reais.<br />
O código fica assim:</p>
<pre class="brush: php;">

&lt;? php
function loadResult()
 {
 $array = array();
 while ($row = mysql_fetch_object( $this-&gt;resultSet )) {
 $array[] = $row;
 }
 mysql_free_result( $this-&gt;resultSet );

 return $array;
 }

?&gt;
</pre>
<p>Como a nossa função não enviar mensagens de erro de volta para o chamador apenas define as variáveis de erro dentro da classe por isso precisamos de função para obter essa informação. Estas são funções getter simples como o seguinte:</p>
<pre class="brush: php;">

&lt;? php
 function getErroCode(){
 return $this-&gt;errorCode;
 }

 function getErroMsg(){
 return $this-&gt;errorMsg;
 }
?&gt;
</pre>
<h3>Etapa 6.</h3>
<p>Como passo final é preciso implementar uma função para obter tempos de consulta. Para fazê-lo, precisamos de uma função que retorna o tempo atual em milisegundos.<br />
Chamando essa função no início e no final das chamadas de funções de conexao, query ou outras do tipo, poderemos calcular o tempo total gasto no db.<br />
Além deste vamos implementar outras 2 funções getter para obter o número de consultas realizadas eo tempo total da consulta em um formato util.</p>
<p>Assim, nossas funções:</p>
<pre class="brush: php;">

&lt;? php
 function getTempo(){
 return round($this-&gt;tempoTotal,6);
 }

 function getSqlCount(){
 return $this-&gt;queryCounter;
 }

 function getMicroTime() {
 list($usec, $sec) = explode(&quot; &quot;,microtime());
 return ((float)$usec + (float)$sec);
 }
?&gt;
</pre>
<p>Bom é isso, no próximo eu mostrarei como utilizar esta classe.. até breve.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.softov.com.br/blog/post/109/classe-abstrata-phpoo-mysql/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>PHP: lendo e tratando informações vindas de um arquivo XML</title>
		<link>http://www.softov.com.br/blog/post/105/php-lendo-e-tratando-informacoes-vindas-de-um-arquivo-xml</link>
		<comments>http://www.softov.com.br/blog/post/105/php-lendo-e-tratando-informacoes-vindas-de-um-arquivo-xml#comments</comments>
		<pubDate>Thu, 24 Sep 2009 20:47:24 +0000</pubDate>
		<dc:creator>fernandosoftov</dc:creator>
				<category><![CDATA[php]]></category>
		<category><![CDATA[xml]]></category>

		<guid isPermaLink="false">http://www.softov.com.br/blog/?p=105</guid>
		<description><![CDATA[Não sou muito ativo no php, sou mais um web-designer, mas como sou um desenvolvedor web e trabalho sozinho nesta área, tenho que me virar procurando certos problemas na web (google). Estes dias estava com dificuldade em ler um XML, de tanto procurar na web encontrei este blog: http://www.vedovelli.com.br/?p=83 Resolvi compartilhar para ajudar quem tem [...]]]></description>
			<content:encoded><![CDATA[<p>Não sou muito ativo no php, sou mais um web-designer, mas como sou um desenvolvedor web e trabalho sozinho nesta área, tenho que me virar procurando certos problemas na web (google).</p>
<p>Estes dias estava com dificuldade em ler um XML, de tanto procurar na web encontrei este blog:</p>
<p>http://www.vedovelli.com.br/?p=83</p>
<p>Resolvi compartilhar para ajudar quem tem ou terá o mesmo problema que eu tive. Modifiquei certas coisas, comentei e postei aqui, espero que tenham facilidade em entender o Post!, qualquer duvida comentem.</p>
<pre class="brush: xml;">
&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&lt;root&gt;
&lt;bandas&gt;
&lt;nome&gt;Asian Dub Foundation&lt;/nome&gt;
&lt;nome&gt;REM&lt;/nome&gt;
&lt;nome&gt;Everything But The Girl&lt;/nome&gt;
&lt;/bandas&gt;
&lt;/root&gt;
</pre>
<p>O xml é o mesmo do exemplo do blog que eu copiei.</p>
<p>Agora temos o php que lerá o XML acima</p>
<pre class="brush: php;">

&lt;?php
$xml = simplexml_load_file(&quot;arquivo.xml&quot;); // Pode ser http://www.algumdominio.com/services/arquivo.xml

for($i=0; $i &lt; count($xml-&gt;bandas-&gt;nome); $i++) {
 echo $xml-&gt;bandas-&gt;nome[$i].&quot;&lt;br /&gt;&quot;;
}
?&gt;
</pre>
<p>Para outro exemplo tenho o XML abaixo</p>
<pre class="brush: xml;">

&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&lt;root&gt;
&lt;bandas&gt;
Gringas
&lt;nome&gt;Asian Dub Foundation&lt;/nome&gt;
&lt;nome&gt;REM&lt;/nome&gt;
&lt;nome&gt;Everything But The Girl&lt;/nome&gt;
&lt;/bandas&gt;

&lt;bandas&gt;
Da nossa Terra
&lt;nome&gt;Detonautas&lt;/nome&gt;
&lt;nome&gt;CPM 22&lt;/nome&gt;
&lt;nome&gt;Skank&lt;/nome&gt;
&lt;/bandas&gt;
&lt;/root&gt;
</pre>
<p>E o php que faz a leitura</p>
<pre class="brush: php;">

&lt;?php
// lê o arquivo xml
$xml = simplexml_load_file(&quot;arquivo2.xml&quot;);

// le todos os filhos pricipais - no caso &quot;bandas&quot;
foreach($xml-&gt;children() as $child){
 // imprime o texto interno
 echo &quot;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&quot;.$child.&quot;:&lt;/strong&gt; &lt;br /&gt;&quot;;

 // le todos os of filhos dos filhos pricipais - no caso &quot;nome&quot;
 foreach($child as $asd){
 // imprime o texto interno
 echo &quot;&quot; . $asd . &quot;&lt;br /&gt;&quot;;
 }
}

// foreach - enquanto tem dados ele lê
// pelo menos é isso que eu entendo
?&gt;
</pre>
<p>Neste segundo exemplo eu leio o XML, e para cada filho leio seus filhos. Assim tenho o filho &#8220;bandas&#8221; e seus filhos &#8220;nome&#8221;.</p>
<p><a href="http://www.softov.com.br/blogmodelos/phpxml1/exemplo1.php" target="_blank">Os exemplos podem ser vistos aqui</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.softov.com.br/blog/post/105/php-lendo-e-tratando-informacoes-vindas-de-um-arquivo-xml/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Jquery + Ajax + PHP</title>
		<link>http://www.softov.com.br/blog/post/93/jquery-ajax-php</link>
		<comments>http://www.softov.com.br/blog/post/93/jquery-ajax-php#comments</comments>
		<pubDate>Thu, 10 Sep 2009 20:06:25 +0000</pubDate>
		<dc:creator>fernandosoftov</dc:creator>
				<category><![CDATA[jQuery]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[ajax]]></category>
		<category><![CDATA[html]]></category>

		<guid isPermaLink="false">http://www.softov.com.br/blog/?p=93</guid>
		<description><![CDATA[No post  &#8211; Jquery, introdução &#8211; anterior a este falei um pouco sobre Jquery, como o titulo diz, uma breve introdução, hoje falarei sobre o uso de jQuery + Ajax + PHP. Em breve exemplo usarei o envio de formulário, deixarei a validação do mesmo para um post posterior. Primeiramente acesse este link http://docs.jquery.com/Downloading_jQuery, e [...]]]></description>
			<content:encoded><![CDATA[<p>No post  &#8211; <a title="Neste Site" href="http://www.softov.com.br/blog/archives/82" target="_self">Jquery, introdução</a> &#8211; anterior a este falei um pouco sobre Jquery, como o titulo diz, uma breve introdução, hoje falarei sobre o uso de jQuery + Ajax + PHP.</p>
<p>Em breve exemplo usarei o envio de formulário, deixarei a validação do mesmo para um post posterior.</p>
<p>Primeiramente acesse este link <a href="http://docs.jquery.com/Downloading_jQuery" target="_blank">http://docs.jquery.com/Downloading_jQuery</a>, e faça o download da versão mais recente da JQuery.</p>
<p>Seguindo a estrutura html básica</p>
<pre class="brush: xml;">

&lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD XHTML 1.0 Transitional//EN&quot; &quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&quot;&gt;
&lt;html xmlns=&quot;http://www.w3.org/1999/xhtml&quot;&gt;
&lt;head&gt;
&lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=utf-8&quot; /&gt;
&lt;title&gt;Ajax Post - Erick Alves&lt;/title&gt;
&lt;script src=&quot;js/jquery-1.3.2.min.js&quot; type=&quot;text/javascript&quot; language=&quot;javascript&quot;&gt;&lt;/script&gt;

&lt;/head&gt;

&lt;body&gt;
&lt;form action=&quot;#&quot; method=&quot;post&quot;&gt;
&lt;label&gt;Nome: &lt;input type=&quot;text&quot; name=&quot;nome&quot; id=&quot;nome&quot; /&gt;&lt;/label&gt;
&lt;label&gt;Email: &lt;input type=&quot;text&quot; name=&quot;email&quot; id=&quot;email&quot; /&gt;&lt;/label&gt;
&lt;label&gt;Telefone: &lt;input type=&quot;text&quot; name=&quot;telefone&quot; id=&quot;telefone&quot; /&gt;&lt;/label&gt;
&lt;input type=&quot;button&quot; value=&quot;Enviar&quot; id=&quot;enviar&quot; /&gt;
&lt;/form&gt;
&lt;div id=&quot;resposta&quot;&gt;&lt;/div&gt;
&lt;/body&gt;
&lt;/html&gt;
</pre>
<p>Neste html eu criei um formulario com os campos, nome, email e telefone,  respectivamente cada um com seu id, para utilizarmos eles no jQuery.</p>
<p>Entres as tags &lt;head&gt;&lt;/head&gt; eu inseri o jQuery</p>
<pre class="brush: xml;">

&lt;script src=&quot;js/jquery-1.3.2.min.js&quot; type=&quot;text/javascript&quot; language=&quot;javascript&quot;&gt;&lt;/script&gt;
</pre>
<p>Depois disso criaremos uma página chamada de enviar.php com a seguinte estrutura</p>
<pre class="brush: php;">

&lt;?php
// recebo os campos via $_POST[''];
$nome = $_POST['nome'];
$email = $_POST['email'];
$telefone = $_POST['telefone'];

// verifico se estão preenchidos
if (!($nome) || !($email) || !($telefone)){
     echo 'Preencha todos os campos!';
     exit();
}
//Abrindo Conexao com o banco de dados
$conexao = mysql_pconnect(&quot;localhost&quot;,&quot;usuario&quot;,&quot;senha&quot;) or die (mysql_error());
$banco = mysql_select_db(&quot;bancodedados&quot;);

//Utilizando o  mysql_real_escape_string voce se protege o seu código contra SQL Injection.
$nome = mysql_real_escape_string($nome);
$email = mysql_real_escape_string($email);
$telefone = mysql_real_escape_string($telefone);

$insert = mysql_query(&quot;insert into contatos (nome,email,telefone) values ('{$nome}','{$email}','{$telefone}')&quot;);
mysql_close($conexao);
if($insert) {
     echo 'Cadastro Realizado!';
}else {
     echo 'Erro ao Cadastrar!';
}
?&gt;
</pre>
<p>O exemplo acima está auto comentado e de fácil entendimento.</p>
<p>E agora? O formulario não vai funcionar pois não estamos setando nenhum action nele. Isso é importante para o funcionamento dele via jQuery.</p>
<p>Utilizaremos agora a função <em><strong>click </strong></em>do jQuery, instanciando o elemento de id &#8220;<strong>enviar</strong>&#8220;, no caso do formulario html o botão de envio.</p>
<p>Receberemos os valores dos campos de id:</p>
<ul>
<li>nome</li>
<li>email</li>
<li>telefone</li>
</ul>
<p>Feito isso, teremos a função post do jQuery, requisitando dados no envia.php e passando como paramentro nossos campos.</p>
<p>Instanciamos o elemento de id &#8220;<strong>resposta</strong>&#8221; para receber o retorno do nosso ajax.</p>
<p>Tudo isso é feito utilizando o script jQuery abaixo</p>
<pre class="brush: jscript;">
&lt;script type=&quot;text/javascript&quot;&gt;
$(document).ready(function() {
    $(&quot;#enviar&quot;).click(function() {
       var nome = $(&quot;#nome&quot;);
       var nomePost = nome.val();
       var email = $(&quot;#email&quot;);
       var emailPost = email.val();
       var telefone = $(&quot;#telefone&quot;);
       var telefonePost = telefone.val();
       $.post(&quot;enviar.php&quot;, {nome: nomePost, email: emailPost, telefone: telefonePost},
       function(data){
          $(&quot;#resposta&quot;).html(data);
       }
       , &quot;html&quot;);
     });
});
&lt;/script&gt;
</pre>
<p>Que deve ser inserido entre as tags head do seu html.</p>
<p>Fim&#8230;</p>
<p>Temos também no jQuery outros modos de enviar requisições ajax, como a própria funçao $.ajax().</p>
<p>Mas deixarei isso para outro post, assim como as validações.</p>
<p>Bem isso é tudo pessoal.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.softov.com.br/blog/post/93/jquery-ajax-php/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Jquery, introdução</title>
		<link>http://www.softov.com.br/blog/post/82/jquery-introducao</link>
		<comments>http://www.softov.com.br/blog/post/82/jquery-introducao#comments</comments>
		<pubDate>Mon, 07 Sep 2009 00:22:43 +0000</pubDate>
		<dc:creator>fernandosoftov</dc:creator>
				<category><![CDATA[jQuery]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[javascript]]></category>

		<guid isPermaLink="false">http://www.softov.com.br/blog/?p=82</guid>
		<description><![CDATA[O jQuery, é uma das melhores coisas que aconteceram nos últimos anos em termos de programação. A Linguagem jQuery é rápida e concisa, ao utilizala, tornamos o site extremamente poderoso, funcional e atractivo. Neste post vou mostrar uma introdução ao Jquery, motivos para utiliza-lo no desenvolvimento de um web site. Vantagens: Compatibilidade com qualquer navegador; [...]]]></description>
			<content:encoded><![CDATA[<p>O jQuery, é uma das melhores coisas que aconteceram nos últimos anos em termos de programação. A Linguagem jQuery é rápida e concisa, ao utilizala, tornamos o site extremamente poderoso, funcional e atractivo.</p>
<p>Neste post vou mostrar uma introdução ao Jquery, motivos para utiliza-lo no desenvolvimento de um web site.</p>
<h3>Vantagens:</h3>
<ul>
<li>Compatibilidade com qualquer navegador;</li>
<li>Seu peso é bem leve ficando em torno de 20kb(comprimido);</li>
<li>Otimização de código, você evita de programar linhas e linhas de código;</li>
<li>Você consegue acessar a qualquer elemento ou combinações de elementos;</li>
<li>Possui diversos efeitos visuais para deixar seu site mais atraente.</li>
</ul>
<h3>Introdução</h3>
<p>Primeiramente acesse este link <a href="http://docs.jquery.com/Downloading_jQuery" target="_blank">http://docs.jquery.com/Downloading_jQuery</a>, e faça o download da versão mais recente da JQuery. De prefencia baixe a versão comprimida.</p>
<p>Após ter efetuado o download bastar inserir o jquery entre os heads do seu html</p>
<pre class="brush: xml;">
&lt;script type=&quot;text/javascript&quot; language
=&quot;javascript&quot; src=&quot;javascript/jquery.js&quot;&gt;&lt;/script&gt;
</pre>
<h3>Utilizando</h3>
<p>O uso do jQuery é bem simples, digamos que você queira selecionar todas as tgs &#8216;div&#8217;.</p>
<p>Em javascript</p>
<pre class="brush: jscript;">
document.getElementsByTagName(&quot;div&quot;);
</pre>
<p>Em jQuery:</p>
<pre class="brush: jscript;">
(&quot;div&quot;);
</pre>
<p>Seguindo o exemplo acima já podemos ter uma noção da simplicidade do uso do jQuery. Agora supomos que vc queira selecionar não todas as divs, mas outro elemento pelo id ou pela classe.</p>
<pre class="brush: jscript;">

// pela id conteudo
(&quot;#conteudo&quot;);

// pela classe link
(&quot;.link&quot;);

//um link com a classe titulo
(&quot;a.titulo&quot;);

//selecionando todas as div com a classe menu que estão dentro da div conteudo
(&quot;#conteudo div.menu&quot;);
//ou
(&quot;div.menu&quot;, &quot;#conteudo&quot;);
</pre>
<p>A estrutura segue este padrão bem simples. Sem muita complicação.</p>
<p>Bom agora vejamos como utilizar efeitos no jQuery.</p>
<pre class="brush: jscript;">

// escondendo um elemento
(&quot;#id_do_elemento&quot;).hide()

// mostrando o elemento
(&quot;#id_do_elemento&quot;).show()
</pre>
<p>No exemplo acima temos<br />
<strong>(&#8220;#id_do_elemento&#8221;)</strong> = refencia ao elemento<br />
<strong>hide(&#8220;slow&#8221;)</strong> = efeito</p>
<p>O jQuery conta também com efeitos do tipo fadeIn, fadeOut e fadeTo</p>
<pre class="brush: jscript;">
(&quot;p&quot;).fadeIn(&quot;slow&quot;);
(&quot;p&quot;).fadeOut(&quot;slow&quot;);
(&quot;p&quot;).fadeTo(&quot;slow&quot;);
</pre>
<h3>Eventos</h3>
<p>Agora queremos um elemento que ao clicarmos nele dispara um evento em outro elemento.</p>
<p>Estrutura html</p>
<pre class="brush: xml;">

&lt;a href=&quot;#&quot; class=&quot;mostra&quot;&gt;mostrar div&lt;/a&gt;

&lt;div id=&quot;recebe&quot; style=&quot;display:none;&quot;&gt;estou mostrando esta div&lt;/div&gt;
</pre>
<p>Estrutura jQuery</p>
<pre class="brush: jscript;">
$(document).ready(function(){
                $(&quot;a.mostra&quot;).click(function(){
                         $(&quot;#recebe&quot;).show();
                 });
});
</pre>
<p>Exemplo:<br />
<a class="mostra" href="javascript:void(0);">mostrar div</a></p>
<div id="recebe" style="display:none;background-color:#ff0">estou mostrando esta div</div>
<p><script type="text/javascript">// <![CDATA[
 $(document).ready(function(){                $("a.mostra").click(function(){                        $("#recebe").show();                }); });
// ]]&gt;</script></p>
<p>O que foi feito é bem simples, pegamos a tag de link &#8220;<em>a</em>&#8221; com a classe &#8220;<em>mostra</em>&#8221; e adicionamos uma acão ao ser clicado &#8220;<strong>.click(function(){ }) </strong>;&#8221;, dentro da função instanciamos o elemento de id &#8220;<em>recebe</em>&#8220;, adicionando o efeito de <strong>show();</strong></p>
<p>O jQuery é bem dinamico e ainda possibilita a manipulação de objetos <strong>DOM</strong>, Ajax, validação de formulário e muitos outros efeitos.</p>
<p>Por hoje é tudo pessoal, logo estarei postando aqui mais funcionalidades do jQuery.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.softov.com.br/blog/post/82/jquery-introducao/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Centralizar div com css</title>
		<link>http://www.softov.com.br/blog/post/71/centralizar-div-com-css</link>
		<comments>http://www.softov.com.br/blog/post/71/centralizar-div-com-css#comments</comments>
		<pubDate>Tue, 01 Sep 2009 18:43:13 +0000</pubDate>
		<dc:creator>fernandosoftov</dc:creator>
				<category><![CDATA[Dicas]]></category>
		<category><![CDATA[desenvolvimento web]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[xhtml]]></category>

		<guid isPermaLink="false">http://www.softov.com.br/blog/?p=71</guid>
		<description><![CDATA[Desde que eu comecei a desenvolver sites seguindo um padrão tive muitos problemas na centralização de uma div no navegador, aonde eu consequia centralizar no mozilla e no IE ficava desconfigurado. Bem, para quem o mesmo problema que eu tive, veja a abaixo a solução. Sigamos a estrutura a seguir dentro do body. &#60;body&#62; &#60;div [...]]]></description>
			<content:encoded><![CDATA[<p>Desde que eu comecei a desenvolver sites seguindo um padrão tive muitos problemas na centralização de uma div no navegador, aonde eu consequia centralizar no mozilla e no IE ficava desconfigurado.</p>
<p>Bem, para quem o mesmo problema que eu tive, veja a abaixo a solução.</p>
<p>Sigamos a estrutura a seguir dentro do body.</p>
<pre class="brush: xml;">
&lt;body&gt;
&lt;div id=&quot;geral&quot;&gt;
&lt;div id=&quot;corpo&quot;&gt;
conteudo
&lt;/div&gt;
&lt;/div&gt;
&lt;/body&gt;
</pre>
<p>E dentro do seu style ou se preferir colocar dentro de um .css o código a seguir</p>
<pre class="brush: css;">
body{
 background-color:#efefef; /*um fundo para visualizar a div*/
 margin:0px;
 padding:0px;
 text-align:center; /* bug do IE 6*/

}
#geral{
 margin:0 auto;
 width:900px;
 background-color:#FFF; /*um fundo para visualizar a div*/
 text-align:left;
}
#corpo{
 padding:10px;
}
</pre>
<p><a href="http://www.softov.com.br/blogmodelos/centradiv" target="_blank">Veja o exemplo aqui</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.softov.com.br/blog/post/71/centralizar-div-com-css/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Controle de tráfego com TC, HTB e Iptables</title>
		<link>http://www.softov.com.br/blog/post/41/controle-de-trafego-com-tc-htb-e-iptables</link>
		<comments>http://www.softov.com.br/blog/post/41/controle-de-trafego-com-tc-htb-e-iptables#comments</comments>
		<pubDate>Tue, 25 Aug 2009 22:08:27 +0000</pubDate>
		<dc:creator>fernandosoftov</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[controle de tráfego]]></category>
		<category><![CDATA[htb]]></category>
		<category><![CDATA[iptables]]></category>
		<category><![CDATA[shell]]></category>
		<category><![CDATA[tc]]></category>

		<guid isPermaLink="false">http://www.softov.com.br/blog/?p=41</guid>
		<description><![CDATA[Estava montando um servidor de Internet via rádio e tive a necessidade de fazer o controle de tráfego dos clientes ip por ip, pois determinados usuários teriam meros 128kbps de download enquanto outros teriam 256kbps e eu como admin teria meus meros 2048kbps de download. Em termos leigos, fucei e fucei na Internet até encontra [...]]]></description>
			<content:encoded><![CDATA[<p>Estava montando um servidor de Internet via rádio e tive a necessidade de fazer o controle de tráfego dos clientes ip por ip, pois determinados usuários teriam meros 128kbps de download enquanto outros teriam 256kbps e eu como admin teria meus meros 2048kbps de download.</p>
<p>Em termos leigos, fucei e fucei na Internet até encontra o site do <a title="http://www.eriberto.pro.br" rel="nofollow" href="http://www.eriberto.pro.br/">João Eriberto Mota Filho</a>, aonde aprendi muito sobre as regras de controle de tráfego utilizando o tc, htb e iptables, então resolvi compartilhar com quem tambêm tem a necessidade de efectuar este controle.</p>
<p>Muitas pessoas confundem controle de tráfego com controle de banda.</p>
<ul>
<li> Banda (ou bandwidth):  é a diferença entre os limites superior e inferior de uma freqüência, geralmente medida em hertz.</li>
<li> Tráfego:  quantidade de informações digitais transmitidas, geralmente medida em bits por segundo (b/s).</li>
</ul>
<p>Assim, ao controlar um tráfego de rede estaremos realizando um controle de tráfego e não de banda, como muitos dizem. Para alterar as propriedades de uma banda, teremos que fazer alterações físicas no meio.</p>
<p>Agora imagine uma rede que possua Internet, com um link de 2 Mb/s, e 50 máquinas. Exemplos atuais: prédios, pequenas empresas, lan houses, faculdade (essa vai para o Biguá),  etc. Imagine ainda que nessa rede possa ser utilizado qualquer tipo de programa de acesso à Internet.</p>
<p>Numa rede liberal, programas como o EMule ou o Kazaa poderão causar um enorme congestionamento. Um único EMule instalado em um computador da rede poderá abrir dezenas de conexões simultâneas. Com isso, caso algum outro usuário, em outro computador, deseje visitar o GMail, por exemplo, teremos uma máquina, estabelecendo uma conexão, lutando contra outro computador com 60 conexões (apenas um exemplo). Teremos, em outras palavras, 01 contra 60. É óbvio que haverá uma grande desvantagem para um dos dois. Isso ocorre porque, da forma como o Kernel Linux trabalha, normalmente, os pacotes são enfileirados em um buffer e saem na mesma ordem em que chegaram (FIFO, para os mais experientes, o primeiro que entra é o primeiro que sai). Aumentar o link, ao contrário do que muitos desinformados pensam, não resolveria o caso, pois só estaríamos dando mais &#8220;poder de fogo&#8221; ao usuário do EMule e continuaríamos sendo o 60º da fila. <strong>O que fazer então?</strong></p>
<ul>
<li> Bloquear o EMule, tornando-se um administrador radical e forçando o usuário de tal programa a achar uma forma de burlar o controle (sempre há uma forma de fazer isso). Ainda, o EMule foi bloqueado mas outros programas similares não. Existem centenas deles.</li>
<li> Controlar o tráfego da rede, fazendo com que haja um equilíbrio ou uma prioridade na navegação. Esta parece ser a forma mais sensata<span id="more-41"></span></li>
</ul>
<p>Observe as seguintes idéias:</p>
<ul>
<li> Em tráfego de rede estaremos submetidos à base decimal e não à binária, como em processamento, armazenamento e memória. Assim, 1 KByte por segundo será igual a 1000 bytes por segundo.</li>
<li> A abreviatura de byte é <strong>B</strong>.</li>
<li> A abreviatura de bit é <strong>b</strong>.</li>
<li> 1 B = 8 b (um byte é composto por 8 bits).</li>
</ul>
<p>Assim, 250 Kb/s são iguais a 31,25 KB/s que são iguais a 31250 B/s.</p>
<p>Agora cheguei em uma parte interessante: Como funciona o HTB.</p>
<p>O HTB funciona de forma hierárquica e, como todas as outras disciplinas, controla os pacotes que saem de uma determinada placa de rede. Isso se deve ao fato de que, quando um pacote chega a uma máquina, ele não pode ficar parado no cabo de rede ou na onda de rádio (wireless) esperando para entrar na placa. O pacote entra e é armazenado no buffer. Assim, só resta controlar a sua saída do buffer para a rede.</p>
<p>Imagine um servidor Linux aonde temos duas placas de rede:</p>
<ul>
<li>eth0: ligada a rede interna</li>
<li>eth1: ligada a internet</li>
</ul>
<p>A interface <em>eth0</em> irá controlar todo o download da Internet e a interface <em>eth1</em> todo o upload.</p>
<p>No que tange à hierarquia, o HTB possui um elemento principal conhecido como <em>root</em>, que receberá a designação numérica <strong>1:0</strong> ou, simplesmente, <strong>1:</strong>. O <em>root</em> possui um subordinado imediato, que controla o tráfego máximo total possível. Esse subordinado é uma <em>classe</em> e receberá a designação <strong>1:1</strong>.</p>
<blockquote><p>Os elementos superiores a cada classe são conhecidos como <em>pais</em>. A indicação para isso é <em>parent</em>.</p></blockquote>
<p>A seguir um exemplo de configuração do <em>root</em> e do parent de controle total de tráfego, para a interface <em>eth0</em>, com o comando <em>tc</em>:</p>
<pre class="brush: bash;">

tc qdisc add dev eth0 root handle 1:0 htb default 40
tc class add dev eth0 parent 1:0 classid 1:1 htb rate 100mbit
</pre>
<p>A primeira linha estabelece o <em>root</em>, para a interface <em>eth0</em>, com a designação <em>1:0</em>, usando a disciplina HTB. A palavra <em>qdisc</em> é a abreviatura de <em>Queue discipline</em> ou disciplina de enfileiramento. Em resumo, refere-se à disciplina de controle de tráfego. A primeira linha também estabelece que a classe default será a <em>1:40</em>.</p>
<blockquote><p>A classe default será utilizada para receber pacotes que não foram designados para trafegar em qualquer outra classe.</p></blockquote>
<p>A segunda linha estabelece que a classe <em>1:0</em> será parent (pai) da <em>1:1</em>. Esta classe estabelece que a interface de rede <em>eth0</em> funcionará a 100 Mb/s.</p>
<p>Veja agora uma configuração do HTB já com algumas classes (dentro de um script em shell bash):</p>
<pre class="brush: bash;">

#!/bin/bash

tc qdisc del dev eth0 root

tc qdisc add dev eth0 root handle 1:0 htb default 40
tc class add dev eth0 parent 1:0 classid 1:1 htb rate 100mbit

tc class add dev eth0 parent 1:1 classid 1:10 htb rate 100kbit  ceil 300kbit  prio 0   # DNS / ACK / SYN / FIN
tc class add dev eth0 parent 1:1 classid 1:20 htb rate 500kbit  ceil 800kbit  prio 1   # E-mail
tc class add dev eth0 parent 1:1 classid 1:30 htb rate 1200kbit ceil 1600kbit prio 2   # HTTP / HTTPS
tc class add dev eth0 parent 1:1 classid 1:40 htb rate 300kbit  ceil 500kbit  prio 3   # Geral
</pre>
<p>A primeira linha remove qualquer pré-configuração existente. As duas linhas seguintes já foram analisadas. As próximas linhas são as classes que irão controlar o tráfego.</p>
<p>A classe <em>1:10</em> é filha da classe <em>1:1</em>. Ela permitirá um tráfego de 100 Kb/s. Caso as outras classes estejam livres, sem tráfego, esta classe poderá emprestar um pouco do link que sobra nas outras, podendo chegar a 300 Kb/s. Esta classe tem prioridade 0, ou seja, todas as outras irão parar para o seu tráfego passar (caso isso seja necessário). No fim da linha há um comentário, que não é obrigatório. Por intermédio desse comentário, entendemos que a classe <em>1:10</em> será utilizada para tráfego DNS e para alguns pacotes com algumas flags TCP. A análise das demais classes segue o mesmo raciocínio. Apenas relembrando, a classe <em>1:40</em> é a classe default e, tudo que não for enviado para as outras classes terminará passando por ela.</p>
<p>A seguir, uma imagem que resume toda a situação explanada até aqui:</p>
<div>
<div><span><a title="Htb1.jpg" href="http://www.eriberto.pro.br/wiki/index.php?title=Imagem:Htb1.jpg"><img src="http://www.eriberto.pro.br/wiki/images/3/3b/Htb1.jpg" border="0" alt="" width="438" height="310" /></a></span></div>
</div>
<p>É interessante fazer uma configuração para a interface <em>eth1</em> para controlar o upload. A configuração para a <em>eth1</em> segue os mesmos princípios da <em>eth0</em>. Exemplo:</p>
<pre class="brush: bash;">
#!/bin/bash

tc qdisc del dev eth1 root

tc qdisc add dev eth1 root handle 1:0 htb default 40
tc class add dev eth1 parent 1:0 classid 1:1 htb rate 100mbit

tc class add dev eth1 parent 1:1 classid 1:10 htb rate 100kbit ceil 300kbit prio 0   # DNS / ACK / SYN / FIN
tc class add dev eth1 parent 1:1 classid 1:20 htb rate 500kbit ceil 500kbit prio 1   # E-mail
tc class add dev eth1 parent 1:1 classid 1:30 htb rate 300kbit ceil 500kbit prio 2   # FTP
tc class add dev eth1 parent 1:1 classid 1:40 htb rate 300kbit ceil 500kbit prio 3   # Geral
</pre>
<blockquote><p>Na classe 1:20, a opção <em>ceil 500kbit</em> poderia ter sido omitida, uma vez que tal <em>ceil</em> possui o mesmo valor de <em>rate</em>.</p></blockquote>
<h2><span> A instalação do comando <em>tc</em> e da disciplina <em>HTB</em> no Debian GNU/Linux </span></h2>
<p>Para instalar o <em>tc</em> e o <em>HTB</em> no Debian, execute:</p>
<pre class="brush: bash;">
# apt-get install iproute
</pre>
<h2><span> A associação do HTB com o Iptables </span></h2>
<p>A divisão do tráfego pelas classes poderá ser feito com o auxílio do Iptables, utilizando a tabela <em>mangle</em> e o alvo <em>CLASSIFY</em>. A seguir, um exemplo de script de configuração do Iptables:</p>
<pre class="brush: bash;">
#!/bin/bash

PATH=/bin:/sbin:/usr/bin:/usr/sbin

iptables -t mangle -F

# portas e-mail (entrada e saida)

iptables -t mangle -A FORWARD -p tcp -m multiport --ports 25,110,995 -j CLASSIFY --set-class 1:20

# trafego HTTP entrando

iptables -t mangle -A FORWARD -o eth0 -p tcp --sport 80 -j CLASSIFY --set-class 1:30

# trafego FTP saindo (upload)

iptables -t mangle -A FORWARD -o eth1 -p tcp --dport 20 -j CLASSIFY --set-class 1:30

# DNS e ACK/SYN/FIN (pacotes com até 60 bytes)

iptables -t mangle -A FORWARD -p udp -m multiport --ports 53 -j CLASSIFY --set-class 1:10  # DNS
iptables -t mangle -A FORWARD -m length --length 0:60 -j CLASSIFY --set-class 1:10         # Flags TCP
</pre>
<blockquote><p>Note que nas classes <em>1:30</em>, em virtude das opções <em>-o eth0</em> e <em>-o eth1</em>, a interface <em>eth0</em> será acionada somente para o tráfego HTTP que entra e a interface <em>eth1</em> somente para o tráfego FTP que sai (porta 20 &#8211; dados).</p></blockquote>
<h2><span> A ordem das regras </span></h2>
<p>Diferentemente das tabelas <em>filter</em> e <em>nat</em>, a tabela <em>mangle</em> lê todas as regras, até o final, mesmo que uma delas case com a situação do pacote em tráfego. Assim, deveremos colocar casos mais específicos como últimas regras.</p>
<p>Observe o exemplo a seguir:</p>
<pre class="brush: bash;">
# iptables -t mangle -A FORWARD -d 10.0.0.1 -p tcp --sport 110 -j CLASSIFY --set-class 1:65
# iptables -t mangle -A FORWARD -d 10.0.0.0/8 -p tcp --sport 110 -j CLASSIFY --set-class 1:70
</pre>
<p>A idéia das regras anteriores foi limitar a leitura de e-mails (protocolo POP3). A máquina 10.0.0.1 vai utilizar a classe 1:65, enquanto que o resto da rede 10.0.0.0 vai ser enquadrada na classe 1:70. No entanto, na prática, isso não irá acontecer, uma vez que a tabela <em>mangle</em> lê todas as regras existentes até o final. Assim, um pacote oriundo da máquina 10.0.0.1 será enquadrado pela primeira regra e, em seguida, pela segunda. Então, valerá a última situação. Ou seja, a ordem correta das regras deverá ser a seguinte:</p>
<pre class="brush: bash;">
# iptables -t mangle -A FORWARD -d 10.0.0.0/8 -p tcp --sport 110 -j CLASSIFY --set-class 1:70
# iptables -t mangle -A FORWARD -d 10.0.0.1 -p tcp --sport 110 -j CLASSIFY --set-class 1:65
</pre>
<h2><span> Tráfego local </span></h2>
<p>Como já foi dito, o controle de tráfego deverá ser feito no momento da saída do pacote pela placa de rede. Assim, caso você tenha que controlar o tráfego gerado pela máquina que contém o HTB, deverá ser utilizada a chain <em>OUTPUT</em> do Iptables. Isso será útil se, por exemplo, você quiser liberar totalmente o acesso à máquina de controle. Se você não fizer isso, um ssh para tal máquina, por exemplo, será impraticável. A seguir, um exemplo de liberação do tráfego:</p>
<pre class="brush: bash;">
# tc class add dev eth0 parent 1:1 classid 1:90 htb rate 100mbit prio 0
# iptables -t mangle -A OUTPUT -j CLASSIFY --set-class 1:90
</pre>
<h2><span> Verificando as <em>qdiscs</em> e as <em>classes</em> existentes </span></h2>
<p>Para verificar as <em>qdiscs</em> e as <em>classes</em> configuradas na <em>eth0</em>, execute:</p>
<pre class="brush: bash;">
# tc qdisc show dev eth0
# tc class show dev eth0
</pre>
<p>Caso deseje ver também detalhes e estatísticas, acresça as chaves <em>-d</em> e <em>-s</em>, da seguinte forma:</p>
<pre class="brush: bash;">
# tc -d -s qdisc show dev eth0
# tc -d -s class show dev eth0
</pre>
<h2><span> O módulo multiport do Iptables </span></h2>
<p>O módulo <em>multiport</em> do Iptables é um excelente elemento para ser utilizado em controle de tráfego, uma vez que é muito flexível. Observe as regras a seguir:</p>
<pre class="brush: bash;">
# iptables -t mangle -A FORWARD -p tcp --sport 110 -j CLASSIFY --set-class 1:78
# iptables -t mangle -A FORWARD -p tcp --sport 995 -j CLASSIFY --set-class 1:78
</pre>
<p>Essas regras poderiam ser substituídas por:</p>
<pre class="brush: bash;"># iptables -t mangle -A FORWARD -p tcp -m multiport --sport 110,995 -j CLASSIFY --set-class 1:78</pre>
<p>Ainda, observe:</p>
<pre class="brush: bash;">
# iptables -t mangle -A FORWARD -p tcp --sport 110 -j CLASSIFY --set-class 1:78
# iptables -t mangle -A FORWARD -p tcp --sport 995 -j CLASSIFY --set-class 1:78

# iptables -t mangle -A FORWARD -p tcp --dport 25 -j CLASSIFY --set-class 1:78
# iptables -t mangle -A FORWARD -p tcp --dport 465 -j CLASSIFY --set-class 1:78
</pre>
<p>Essas regras poderiam ser substituídas por:</p>
<pre class="brush: bash;"># iptables -t mangle -A FORWARD -p tcp -m multiport --port 25,110,465,995 -j CLASSIFY --set-class 1:78</pre>
<p>Outros módulos poderão ser úteis. Para aprender mais sobre eles, utilize o comando:</p>
<pre class="brush: bash;"># man iptables</pre>
<h2><span> As somas das velocidades das classes </span></h2>
<p>As somas das velocidades das classes não necessariamente precisarão ser menores do que a velocidade máxima do link. Apenas como exemplo, admita um link Internet de 1 Mb/s. Você poderá trabalhar com as seguintes classes e prioridades:</p>
<p><img src="http://www.eriberto.pro.br/wiki/images/4/40/Htb2.jpg" border="0" alt="" width="400" height="339" /></p>
<p>Observando a figura anterior, podemos notar que a soma das velocidades é 1150 Kb/s, enquanto o link total é 1000 Kb/s. No entanto, como trabalhamos com prioridades, haverá uma tendência das classes com menos prioridade diminuírem as suas velocidades, proporcionalmente, quando o link estiver saturado, para que as classes com mais prioridade possam trafegar. Entretanto, em virtude das velocidades utilizadas, em caso de saturação do link, nenhuma das classes deverá parar.</p>
<blockquote><p>Observe que não há uma necessidade de seguir uma ordem crescente numérica regular para numerar as classes e as prioridades. O mais importante é fazer a correta ligação com os pais.</p></blockquote>
<h2><span> Pense nisto&#8230; </span></h2>
<p>Observe a figura a seguir e deixe a sua imaginação fluir&#8230;</p>
<p><img src="http://www.eriberto.pro.br/wiki/images/c/cd/Htb3.jpg" border="0" alt="" width="400" height="228" /></p>
<p>Agora, imagine a possibilidade de ramificar a classe 1:50 em mais duas ou três classes&#8230;</p>
<p>fonte:  <a title="Eriberto" href="http://www.eriberto.pro.br/wiki/index.php?title=Controle_de_tr%C3%A1fego_com_TC%2C_HTB_e_Iptables" target="_blank"></a><a title="http://www.eriberto.pro.br" rel="nofollow" href="http://www.eriberto.pro.br/">João Eriberto Mota Filho</a><a title="Eriberto" href="http://www.eriberto.pro.br/wiki/index.php?title=Controle_de_tr%C3%A1fego_com_TC%2C_HTB_e_Iptables" target="_blank"></a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.softov.com.br/blog/post/41/controle-de-trafego-com-tc-htb-e-iptables/feed</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Dez dicas para poupar tempo ao fazer buscas na web</title>
		<link>http://www.softov.com.br/blog/post/39/dez-dicas-para-poupar-tempo-ao-fazer-buscas-na-web</link>
		<comments>http://www.softov.com.br/blog/post/39/dez-dicas-para-poupar-tempo-ao-fazer-buscas-na-web#comments</comments>
		<pubDate>Tue, 25 Aug 2009 21:44:11 +0000</pubDate>
		<dc:creator>fernandosoftov</dc:creator>
				<category><![CDATA[Dicas]]></category>
		<category><![CDATA[Internet]]></category>
		<category><![CDATA[busca]]></category>

		<guid isPermaLink="false">http://www.softov.com.br/blog/?p=39</guid>
		<description><![CDATA[1- Tenha claro o que procura Estar focado no que se busca é básico para que não se perca tempo. Mas se existe algo que inclina à divagação e à dispersão é a busca na Internet. Quando estamos procurando, às vezes encontramos coisas que não eram exatamente nosso objetivo, mas que se tornam interessantes. Então, [...]]]></description>
			<content:encoded><![CDATA[<div>
<p>1- Tenha claro o que procura<br />
Estar focado no que se busca é básico para que não se perca tempo. Mas se existe algo que inclina à divagação e à dispersão é a busca na Internet. Quando estamos procurando, às vezes encontramos coisas que não eram exatamente nosso objetivo, mas que se tornam interessantes. Então, vamos olhar, e acabamos perdendo o caminho. Portanto, ao iniciar uma busca, tenha um objetivo bem definido em mente. Por exemplo, saber “qual o nome dos sete anões da Branca de Neve em espanhol” &#8211; e evite perder tempo averiguando quem dubla cada um dos personagens, o ano do filme da Disney, quantas vezes foi exibido, e assim por diante.<span id="more-39"></span></p>
<p>2- Escolha a ferramenta adequada<br />
“Ora, o Google”, dirão alguns. Mas ainda que este seja o buscador mais popular, a informação flui por diferentes caminhos. Não se restrinja ao site campeão: outros meios podem ser fóruns, blogs, sites especializados ou até mesmo seus contatos no messenger. Às vezes, o que se procura está a um contato de distância. Preste atenção também a outros mecanismos de buscas &#8211; sim, eles existem.</p>
<p>3- Aprenda a usar a ferramenta<br />
Ao escolher um buscador, antes de mais nada vale a pensa investir um pouco de tempo para saber exatamente como ele funciona. Se é melhor realizar a busca usando os termos entre aspas, se usa os operadores lógicos “and”, “or” e outros, ou se realiza buscas contextuais em páginas concretas. Todo o tempo gasto em conhecer a ferramenta é tempo que será economizado ao conseguir utilizá-la com objetividade.</p>
<p>4- Seja claro e objetivo<br />
Ainda que os mecanismos de buscas vão sendo otimizados para entender a maneira de pensar humana, os humanos também podem conhecer a maneira de raciocinar de uma ferramenta de busca. Por exemplo, para fazer uma busca de várias palavras, é conveniente pensar não apenas em como se procura mas também em como o programa que gerencia as buscas vai entender o pedido que se faz. Por exemplo, em vez de procurar por “amor e poesia”, frase que tem um “e” que muitas vezes é ignorado pelos buscadores, é melhor buscar “poesia amor” &#8211; mais facilmente o programa entenderá que são duas palavras-chave a considerar em seus parâmetros de busca.</p>
<p>5 &#8211; Aprenda a diferenciar à primeira vista<br />
Ao fazer uma busca, é bom conseguir determinar de cara se os resultados têm algo a ver o que se quer encontrar. Basta olhar as primeiras palavras de cada resultado para saber se foi encontrada informação útil ou simplesmente sites que pouco têm a ver com o que se precisa encontrar. Perca alguns segundos analisando as primeiras linhas dos resultados. Você saberá se está na pista certa.</p>
<p>6- Use inglês, dicionários e tradutores<br />
Outras línguas, como espanhol ou português, podem até estar ganhando mais espaço na Internet, mas a realidade é que a imensa maioria das páginas está &#8211; ou oferece versão &#8211; em inglês. Portanto, se você não encontra em português o que procura, experimente traduzir as palavras-chave para o inglês e fazer nova busca. Se precisar, utilize dicionários ou mesmo os tradutores online para investigar páginas que pareçam interessantes.</p>
<p>7- Aprenda a buscar indiretamente<br />
A busca indireta dá resultados ótimos quando parece ser impossível encontrar aquilo que se busca. Trata-se de não atacar diretamente o tema que procuramos, mas buscar algo relacionado com ele. Por exemplo, procurar a letra de uma canção de Elvis Presley da qual não se lembra o nome. Se não se encontra nada a partir de “Elvis Presley”, pode-se experimentar usar um pedaço da letra do qual se recorde (como “kiss me my darling”). Entre os primeros resultados, certamente estará a letra de “It’s now or never”. Isso é aplicável a uma grande variedade de temas, e é especialmente útil quando o tema principal da busca é muito amplo ou quando, por exemplo, buscamos o nome de uma pessoa, já que pode haver muito mais gente com tal nome do que se imagina.</p>
<p>8- Imagens<br />
A busca de imagens é especialmente complicada, e para conseguir os melhores resultados, além de usar dicas anteriores (busca indireta, tradução para outras línguas), não use apenas a busca de imagens do Google, por exemplo. Procure também por sites que possam conter as imagens que você quer, e aproveite outros buscadores &#8211; inclusive específicos para imagens.</p>
<p>9- A Wikipedia é amiga<br />
Se a procura é por um termo popular, é quase certo que já exista na wikipedia. A enciclopédia global online colaborativa tem informação de qualidade. Não se perde muito tempo em consultá-la, mas pode-se economizar tempo ao encontrar lá o que se procura e, muitas vezes, outras referências sobre o assunto permitem que se tenha mais fontes de informação.</p>
<p>10- Experiência é a princial aliada<br />
Na busca via Internet a experiência não é um grau, são 360. À medida que fizer buscas, você aprenderá a discriminar melhor, vai adicionar aos seus sites favoritos outros buscadores especializados, que funcionem melhor para determinados assuntos, e aprenderá também a pensar mais como uma ferramenta de busca, porque as entenderá melhor. Ou seja: busque e aprenda com as buscas que faz. Em pouco tempo você se tornará uma ferramenta indispensável para outras pessoas que não vão precisar de um buscador: elas terão você.</p>
<p>Fonte: <a href="http://www.terra.com.br/" target="_blank">www.terra.com.br</a></p>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.softov.com.br/blog/post/39/dez-dicas-para-poupar-tempo-ao-fazer-buscas-na-web/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
