<?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>Boteco Digital</title>
	<atom:link href="http://www.botecodigital.info/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.botecodigital.info</link>
	<description></description>
	<lastBuildDate>Thu, 26 Jan 2012 18:36:46 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Lendo e escrevendo XML em Java com JDOM</title>
		<link>http://www.botecodigital.info/java/lendo-e-escrevendo-xml-em-java-com-jdom/</link>
		<comments>http://www.botecodigital.info/java/lendo-e-escrevendo-xml-em-java-com-jdom/#comments</comments>
		<pubDate>Thu, 26 Jan 2012 18:36:46 +0000</pubDate>
		<dc:creator>Rodrigo Aramburu</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[arquivos]]></category>
		<category><![CDATA[desenvolvimento]]></category>
		<category><![CDATA[XML]]></category>

		<guid isPermaLink="false">http://www.botecodigital.info/?p=1976</guid>
		<description><![CDATA[JDOM é uma biblioteca que visa ser um modo simples de ler e escrever documentos XML. Vamos ver neste tutorial como criar um documento XML e como lê-lo de forma bastante simples. Primeiramente vamos as classes chaves desta biblioteca: Document: Esta classe representa o documento inteiro, esta classe pode ter apenas um elemento que seria o elemento raiz do documento(elemento root), comentários e outros elementos de definição. Element: Esta classe representa um elemento do documento XML(também chamado de nó), são [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.jdom.org/">JDOM</a> é uma biblioteca que visa ser um modo simples de ler e escrever documentos XML. Vamos ver neste tutorial como criar um documento XML e como lê-lo de forma bastante simples.</p>
<p>Primeiramente vamos as classes chaves desta biblioteca:</p>
<p><strong>Document: </strong> Esta classe representa o documento inteiro, esta classe pode ter apenas um elemento que seria o elemento raiz do documento(elemento root), comentários e outros elementos de definição.</p>
<p><strong>Element: </strong> Esta classe representa um elemento do documento XML(também chamado de nó), são os elementos que compõem o documento ele pode conter outros elementos, atributos, comentários e valores.</p>
<p><strong>Attribute: </strong> Esta classe representa um atributo de um elemento XML.</p>
<p>Vamos ao código então! <b>Só não esqueça de <a href="http://www.jdom.org/downloads/index.html">baixar a biblioteca JDOM</a> e incluí-la no seu CLASSPATH.<b> </p>
<pre class="brush: java; title: ; notranslate">
Document doc = new Document();

Element root = new Element(&quot;turma&quot;);

Element pessoa = new Element(&quot;pessoa&quot;);
Attribute sexo = new Attribute(&quot;sexo&quot;,&quot;Masculino&quot;);
pessoa.setAttribute(sexo);

Element nome = new Element(&quot;nome&quot;);
nome.setText(&quot;Rodrigo&quot;);
pessoa.addContent(nome);

Element sobrenome = new Element(&quot;sobrenome&quot;);
sobrenome.setText(&quot;sobrenome&quot;);
pessoa.addContent(sobrenome);

Element notas = new Element(&quot;notas&quot;);
pessoa.addContent(notas);

Element teste1 = new Element(&quot;teste1&quot;);
teste1.setText(&quot;8.3&quot;);
Element teste2 = new Element(&quot;teste2&quot;);
teste2.setText(&quot;7.8&quot;);
Element prova = new Element(&quot;prova&quot;);
prova.setText(&quot;9.2&quot;);

notas.addContent(teste1);
notas.addContent(teste2);
notas.addContent(prova);

root.addContent(pessoa);

doc.setRootElement(root);

XMLOutputter xout = new XMLOutputter();
xout.output(doc , System.out);
</pre>
<p>Na linha 1 é criado o objeto que representa o documento XML, na linha 3 é criado o elemento raiz do documento e é passado para o construtor o nome do elemento, neste caso &#8220;turma&#8221;, é dentro deste elemento que iremos inserir cada elemento XML que irá representar uma pessoa, assim, dentro do elemento &#8220;turma&#8221; pode haver um ou vários elementos &#8220;pessoa&#8221;.</p>
<p>Na linha 5 é criado um elemento &#8220;pessoa&#8221; e nele será inserido as informações sobre a pessoa, como o sexo que será inserido  como um atributo do elemento pessoa e para isso é criado um objeto de atributo na linha 6 e passado para o construtor como parâmetros o nome do atributo e seu valor. Na linha 7 é adicionado o atributo ao elemento &#8220;pessoa&#8221;.</p>
<p>Na linha 9 é criado um elemento nome, é definido um valor para ele na linha 10 e adicionamos este elemento &#8220;nome&#8221; ao elemento &#8220;pessoa&#8221; utilizando  o método <em>addContent</em>, é importante lembrar a diferença deste método com o <em>setContent</em>, o método <em>addContent</em> adiciona o elemento passado por parâmetro ao conteúdo já existente dentro do elemento pai e o método <em>setContent</em> irá substituir o conteúdo anterior do elemento pai se houver.</p>
<p>Nas linhas 13, 14 e 15 é criado e atribuído o elemento de &#8220;sobrenome&#8221; da pessoa.</p>
<p>Na linha 17 é criado um elemento &#8220;notas&#8221; que irá conter outros elementos, que serão as notas da pessoa.</p>
<p>Da linha 20 até 25 é criado três elementos(&#8220;teste1&#8243;,&#8221;teste2&#8243; e &#8220;prova&#8221;) e atribuído valores para eles. Nas linhas 27, 28 e 29 é inserido os elementos &#8220;teste1&#8243;, &#8220;teste2&#8243; e &#8220;prova&#8221;, dentro do elemento &#8220;notas&#8221;.</p>
<p>Na linha 31 adicionamos o elemento &#8220;pessoa&#8221; ao elemento raiz do documento(elemento &#8220;turma&#8221;)  e na linha 33 é adicionado o  elemento turma como elemento root do documento através do método <em> setRootElement</em>.</p>
<p>Na linha 35 é criado um objeto <em>XMLOutputter</em> que é responsável por gerar o XML através do método <em>output</em> que  recebe como parâmetro o objeto do documento a ser escrito e um <em>OutputStream</em> onde será enviado o XML, que no caso foi utilizado a saida padrão. Também poderia criar um outro <em>OutputStream</em> para um arquivo como no exemplo abaixo:</p>
<pre class="brush: java; title: ; notranslate">
XMLOutputter xout = new XMLOutputter();
OutputStream out = new FileOutputStream( new File(&quot;exemplo.xml&quot;));
xout.output(doc , out);
</pre>
<p>A saida do exemplo será a seguinte:</p>
<pre class="brush: xml; title: ; notranslate">
&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&lt;turma&gt;
	&lt;pessoa sexo=&quot;Masculino&quot;&gt;
		&lt;nome&gt;Rodrigo&lt;/nome&gt;
		&lt;sobrenome&gt;sobrenome&lt;/sobrenome&gt;
		&lt;notas&gt;
			&lt;teste1&gt;8.3&lt;/teste1&gt;
			&lt;teste2&gt;7.8&lt;/teste2&gt;
			&lt;prova&gt;9.2&lt;/prova&gt;
		&lt;/notas&gt;
	&lt;/pessoa&gt;
&lt;/turma&gt;
</pre>
<p>Utilizando a mesma estrutura de documento XML veremos um exemplo de leitura:</p>
<pre class="brush: java; title: ; notranslate">
File f = new File(&quot;exemplo.xml&quot;);

SAXBuilder builder = new SAXBuilder();

Document doc = builder.build(f);

Element root = (Element) doc.getRootElement();

List pessoas = root.getChildren();

Iterator i = pessoas.iterator();

while( i.hasNext() ){
		Element pessoa = (Element) i.next();
		System.out.println(&quot;Nome: &quot; + pessoa.getChildText(&quot;nome&quot;));
		System.out.println(&quot;Sobrenome: &quot; + pessoa.getChildText(&quot;sobrenome&quot;));
		System.out.println(&quot;Sexo: &quot; + pessoa.getAttributeValue(&quot;sexo&quot;));
		System.out.println(&quot;Nota( teste1 ): &quot;+pessoa.getChild(&quot;notas&quot;).getChildText(&quot;teste1&quot;));
		System.out.println(&quot;Nota( teste2 ): &quot;+pessoa.getChild(&quot;notas&quot;).getChildText(&quot;teste2&quot;));
		System.out.println(&quot;Nota( prova ): &quot;+pessoa.getChild(&quot;notas&quot;).getChildText(&quot;prova&quot;));
		System.out.println();
}
</pre>
<p>Na linha 1 é criado um objeto representando o arquivo XML a ser lido, na linha 3 é criado o objeto <em>SAXBuilder</em> que é responsável por converter o arquivo em um objeto do tipo <em>Document</em> da biblioteca JDOM.</p>
<p>Na linha 5 é construído o objeto <em>Document</em> através do método <em>builder</em> do <em>SAXBuilder</em>.</p>
<p>Na linha 7 é pego o elemento raiz do documento(elemento &#8220;turma&#8221;) utilizando o método <em>getRootElement</em>. Utilizando este objeto é chamado o método <em>getChildren</em>(linha 9) que retorna um objeto <em>List</em> com todos os elementos filhos, que no caso serão objetos pessoa.</p>
<p>Na linha 11 é definido um iterador para percorrer os elementos &#8220;pessoas&#8221; da lista. </p>
<p>Na linha 14 é utilizado a variável pessoa para armazenar cada objeto pessoa.</p>
<p>Na Linha 15 é utilizado o método <em>getChildText</em> do elemento &#8220;pessoa&#8221; que retorna o valor do elemento filho selecionado, no caso o elemento nome.</p>
<p>Na linha 17 é utilizado po método <em>getAttributeValue</em> que retorna o valor do atributo selecionado, no caso sexo.</p>
<p>Na linha 18 para pegar o valor do elemento &#8220;teste1&#8243; é necessário primeiro selecionar o elemento &#8220;notas&#8221; já que o elemento &#8220;teste1&#8243; se encontra dentro deste, para isso é utilizado o método <em>getChild</em> para somente depois utilizar o método  <em>getChildText</em> para pegar o valor de &#8220;teste1&#8243;.</p>
<p>Como vimos é uma biblioteca bem simples de utilizar e quem já lidou um pouco com XML não deve ter nenhuma dificuldade.</p>
<div id="crp_related"><h4>Posts Relacionados:</h4><ul><li><a href="http://www.botecodigital.info/java/conectando-java-com-mongodb/" rel="bookmark"><img width="50" height="50" src="http://www.botecodigital.info/wp-content/uploads/2011/10/java.png" class="crp_thumb wp-post-image" alt="Conectando Java com MongoDB" title="Conectando Java com MongoDB" /></a> <a href="http://www.botecodigital.info/java/conectando-java-com-mongodb/" rel="bookmark" class="crp_title">Conectando Java com MongoDB</a></li><li><a href="http://www.botecodigital.info/jquery/menu-sanfona-com-jquery/" rel="bookmark"><img width="50" height="50" src="http://www.botecodigital.info/wp-content/uploads/2010/05/jquery.png" class="crp_thumb wp-post-image" alt="Menu Sanfona com JQuery" title="Menu Sanfona com JQuery" /></a> <a href="http://www.botecodigital.info/jquery/menu-sanfona-com-jquery/" rel="bookmark" class="crp_title">Menu Sanfona com JQuery</a></li><li><a href="http://www.botecodigital.info/php/criando-um-feed-com-simplexml/" rel="bookmark"><img width="50" height="50" src="http://www.botecodigital.info/wp-content/uploads/2010/04/php.png" class="crp_thumb wp-post-image" alt="Criando um FEED com SimpleXML" title="Criando um FEED com SimpleXML" /></a> <a href="http://www.botecodigital.info/php/criando-um-feed-com-simplexml/" rel="bookmark" class="crp_title">Criando um FEED com SimpleXML</a></li><li><a href="http://www.botecodigital.info/jquery/trocando-dados-utilizando-json/" rel="bookmark"><img width="50" height="50" src="http://www.botecodigital.info/wp-content/uploads/2010/05/jquery.png" class="crp_thumb wp-post-image" alt="Trocando dados utilizando JSON" title="Trocando dados utilizando JSON" /></a> <a href="http://www.botecodigital.info/jquery/trocando-dados-utilizando-json/" rel="bookmark" class="crp_title">Trocando dados utilizando JSON</a></li></ul></div>]]></content:encoded>
			<wfw:commentRss>http://www.botecodigital.info/java/lendo-e-escrevendo-xml-em-java-com-jdom/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>HTML5 novos elementos de estrutura</title>
		<link>http://www.botecodigital.info/web/html5-novos-elementos-de-estrutura/</link>
		<comments>http://www.botecodigital.info/web/html5-novos-elementos-de-estrutura/#comments</comments>
		<pubDate>Sat, 14 Jan 2012 18:09:19 +0000</pubDate>
		<dc:creator>Rodrigo Aramburu</dc:creator>
				<category><![CDATA[Web]]></category>
		<category><![CDATA[html5]]></category>

		<guid isPermaLink="false">http://www.botecodigital.info/?p=1957</guid>
		<description><![CDATA[O HTML5 vem para ser a atualização da linguagem HTML. Ela cria várias novas tags na linguagem para que o CSS e o Javascript fazerem melhor seu trabalho sem precisar da instalação de vários plugin, compromentendo o desempenho, e trazer mais semântica ao código HTML. Embora o padrão não esteja terminado e plenamente suportado, podemos começar a utilizar alguns de seus recursos já que ele esta sendo disponibilizados em módulos. Uma das mudanças que já podemos utilizar é a estrutura [...]]]></description>
			<content:encoded><![CDATA[<p>O HTML5 vem para ser a atualização da linguagem HTML. Ela cria várias novas tags na linguagem para que o CSS e o Javascript fazerem melhor seu trabalho sem precisar da instalação de vários plugin, compromentendo o desempenho, e trazer mais semântica ao código HTML. </p>
<p>Embora o padrão não esteja terminado e plenamente suportado, podemos começar a utilizar alguns de seus recursos já que ele esta sendo disponibilizados em módulos. Uma das mudanças que já podemos utilizar é a  estrutura da página, que foram criadas tags novas para representar semanticamente a estrutura da página.</p>
<p>Antigamente(HTML4/XHTML) utilizávamos a seguinte estrutura:</p>
<div style="text-align:center">
<a href="http://www.botecodigital.info/wp-content/uploads/2012/01/structure-div.png" class="cboxModal" rel="lightbox[1957]" title="structure-div"><img src="http://www.botecodigital.info/wp-content/uploads/2012/01/structure-div.png" alt="" title="structure-div" class="aligncenter size-medium wp-image-1971" /></a>
</div>
<p>Para deixar mais semântica a estrutura da página foram adicionadas as tags: <strong>section</strong> , <strong>article</strong>, <strong>aside</strong> e <strong>nav</strong>, <strong>header</strong> e <strong>footer</strong>.</p>
<div style="text-align:center">
<a href="http://www.botecodigital.info/wp-content/uploads/2012/01/structure-html5.png" class="cboxModal" rel="lightbox[1957]" title="structure-html5"><img src="http://www.botecodigital.info/wp-content/uploads/2012/01/structure-html5.png" alt="" title="structure-html5" class="aligncenter size-medium wp-image-1972" /></a>
</div>
<p>Utilizando estas nova tags podemos criar a seguinte estrutura:</p>
<pre class="brush: xml; title: ; notranslate">
&lt;!DOCTYPE html&gt;

&lt;html&gt;

	&lt;head&gt;
		&lt;title&gt;Exemplo de estrutura de site em HTML5&lt;/title&gt;
		&lt;meta charset=&quot;utf-8&quot;&gt;
		&lt;link rel=&quot;stylesheet&quot; href=&quot;estilo.css&quot;&gt;
	&lt;/head&gt;

	&lt;body&gt;
		&lt;div id=&quot;site&quot;&gt;
			&lt;header id=&quot;topo&quot;&gt;
				&lt;h1&gt;Titulo do site&lt;/h1&gt;
			&lt;/header&gt;

			&lt;nav id=&quot;menu&quot;&gt;
				&lt;ul&gt;
					&lt;li&gt;&lt;a href=&quot;#&quot;&gt;Link 1&lt;/a&gt;&lt;/li&gt;
					&lt;li&gt;&lt;a href=&quot;#&quot;&gt;Link 1&lt;/a&gt;&lt;/li&gt;
					&lt;li&gt;&lt;a href=&quot;#&quot;&gt;Link 1&lt;/a&gt;&lt;/li&gt;
					&lt;li&gt;&lt;a href=&quot;#&quot;&gt;Link 1&lt;/a&gt;&lt;/li&gt;
					&lt;li&gt;&lt;a href=&quot;#&quot;&gt;Link 1&lt;/a&gt;&lt;/li&gt;
					&lt;li&gt;&lt;a href=&quot;#&quot;&gt;Link 1&lt;/a&gt;&lt;/li&gt;
				&lt;/ul&gt;
			&lt;/nav&gt;
			&lt;section id=&quot;conteudo&quot;&gt;
				&lt;header&gt;
					&lt;h2&gt;Titulo do artigo&lt;/h2&gt;
					&lt;small&gt;12/12/2012&lt;/small&gt;
				&lt;/header&gt;

				&lt;article&gt;

				&lt;/article&gt;
				&lt;footer&gt;
					Por Fulano
				&lt;/footer&gt;
			&lt;/section&gt;	

			&lt;aside&gt;

			&lt;/aside&gt;
			&lt;footer&gt;
				&lt;a href=&quot;http://www.botecodigital.info&quot;&gt;Boteco Digital&lt;/a&gt;
			&lt;/footer&gt;
		&lt;/div&gt;
	&lt;/body&gt;

&lt;/html&gt;
</pre>
<p><a href="http://www.botecodigital.info/exemplos/estruturahtml5/" target="_blank">Veja o exemplo</a></p>
<p>Para começar o <strong>DOCTYPE</strong> foi bastante simplificado, bem como a <strong>metatag charset</strong>. Eu particularmente agradeço já que nunca consegui decorá-las, sempre tive que abrir um arquivo e copiar.</p>
<p>Vamos a uma breve descrição das novas tags.</p>
<h4>section</h4>
<p>A tag <em>section</em> define uma nova seção do site, uma área genérica do site. Por exemplo a home pode ser dividida em destaque, novidades, chamada para conteúdo completo.</p>
<h4>header</h4>
<p>O elemento <em>header</em> representa uma área de introdução. Pode ser utilizado para agrupar índices de conteúdo, campos de busca, cabeçalho do site com titulo ou logo.</p>
<h4>footer</h4>
<p>A tag <em>footer</em> representa o rodapé do site, ou de uma seção.</p>
<h4>nav</h4>
<p>O elemento <em>nav</em> é utilizado para representar uma seção da página que contém links para outras partes do site. Este elemento deve ser utilizado para grupos de links importantes do site tipicamente menus de navegação.</p>
<h4>article</h4>
<p>O elemento <em>article</em> é utilizado para representar o conteúdo do site propriamente dito, como posts, artigos e outros textos em geral.</p>
<h4>aside</h4>
<p>A tag <em>aside</em>  representa um bloco de conteúdo que referência o conteúdo que envolta do elemento aside.</p>
<p>Porém vários navegadores, principalmente os mais antigos, não reconhecem devidamente as novas marcações. Para mantermos a compatibilidade é necessário estilizar algumas tags usando a seguinte regra CSS.</p>
<pre class="brush: css; title: ; notranslate">
header , footer , article , aside , nav , section {display:block}
</pre>
<p>Para verificar o suporte a HTML5 e CSS3  podemos utilizar a  Modernizr (<a href="http://www.modernizr.com/" target="_blank">http://www.modernizr.com/</a>) que é uma biblioteca de detectação que lhe permite  verificar o suporte da maioria das características do HTML5 e CSS3. O Modernizr roda automaticamente assim que você o adiciona no head do documento fazendo funcionar as novas tags em navegadores mais antigos(IE8). </p>
<div id="crp_related"><h4>Posts Relacionados:</h4><ul><li><a href="http://www.botecodigital.info/web/construindo-uma-galeria-de-fotos-com-o-plugin-prettyphoto-do-jquery/" rel="bookmark"><img width="50" height="50" src="http://www.botecodigital.info/wp-content/uploads/2010/05/jquery.png" class="crp_thumb wp-post-image" alt="Construindo uma Galeria de Fotos com o plugin PrettyPhoto do JQuery" title="Construindo uma Galeria de Fotos com o plugin PrettyPhoto do JQuery" /></a> <a href="http://www.botecodigital.info/web/construindo-uma-galeria-de-fotos-com-o-plugin-prettyphoto-do-jquery/" rel="bookmark" class="crp_title">Construindo uma Galeria de Fotos com o plugin PrettyPhoto do JQuery</a></li><li><a href="http://www.botecodigital.info/jquery/menu-sanfona-com-jquery/" rel="bookmark"><img width="50" height="50" src="http://www.botecodigital.info/wp-content/uploads/2010/05/jquery.png" class="crp_thumb wp-post-image" alt="Menu Sanfona com JQuery" title="Menu Sanfona com JQuery" /></a> <a href="http://www.botecodigital.info/jquery/menu-sanfona-com-jquery/" rel="bookmark" class="crp_title">Menu Sanfona com JQuery</a></li><li><a href="http://www.botecodigital.info/jquery/iniciando-com-jquery/" rel="bookmark"><img width="50" height="50" src="http://www.botecodigital.info/wp-content/uploads/2010/05/jquery.png" class="crp_thumb wp-post-image" alt="Iniciando com JQuery" title="Iniciando com JQuery" /></a> <a href="http://www.botecodigital.info/jquery/iniciando-com-jquery/" rel="bookmark" class="crp_title">Iniciando com JQuery</a></li><li><a href="http://www.botecodigital.info/jquery/validando-formularios-com-jquery-plugin-validation/" rel="bookmark"><img width="50" height="50" src="http://www.botecodigital.info/wp-content/uploads/2010/05/jquery.png" class="crp_thumb wp-post-image" alt="Validando formulários com JQuery-Plugin-Validation" title="Validando formulários com JQuery-Plugin-Validation" /></a> <a href="http://www.botecodigital.info/jquery/validando-formularios-com-jquery-plugin-validation/" rel="bookmark" class="crp_title">Validando formulários com JQuery-Plugin-Validation</a></li></ul></div>]]></content:encoded>
			<wfw:commentRss>http://www.botecodigital.info/web/html5-novos-elementos-de-estrutura/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Criando gráficos legais com pChart 2.0</title>
		<link>http://www.botecodigital.info/php/criando-graficos-legais-com-pchart-2-0/</link>
		<comments>http://www.botecodigital.info/php/criando-graficos-legais-com-pchart-2-0/#comments</comments>
		<pubDate>Sat, 26 Nov 2011 01:48:52 +0000</pubDate>
		<dc:creator>Rodrigo Aramburu</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[graficos]]></category>
		<category><![CDATA[imagens]]></category>

		<guid isPermaLink="false">http://www.botecodigital.info/?p=1742</guid>
		<description><![CDATA[&#8220;Uma imagem diz mais que mil palavras&#8221;, se isso é verdade é muito discutível, mas com certeza um gráfico facilita bastante a assimilação de uma boa quantidade de dados. Gráficos são importantes com certeza(os administradores adoram) e agregam bastante a um sistema. Até pouco tempo a única biblioteca de gráficos que eu conhecia utilizava Flash e era bem complicada de mexer, a Fusion Charts, mas a alguns meses descobri uma biblioteca bem mais interessante a pChart que gera gráficos muito [...]]]></description>
			<content:encoded><![CDATA[<p>&#8220;Uma imagem diz mais que mil palavras&#8221;, se isso é verdade é muito discutível, mas com certeza um gráfico facilita bastante a assimilação de uma boa quantidade de dados. Gráficos são importantes com certeza(os administradores adoram) e agregam bastante a um sistema.</p>
<p>Até pouco tempo a única biblioteca de gráficos que <b>eu</b> conhecia utilizava <em>Flash</em> e era bem complicada de mexer, a <a href="http://www.fusioncharts.com/">Fusion Charts</a>, mas a alguns meses descobri uma biblioteca bem mais interessante a <a href="http://www.pchart.net/">pChart</a> que gera gráficos muito bonitos e de forma bem fácil. Então vamos parar de enrolação e vamos colocar a mão na massa. </p>
<p>Primeiro é claro vamos <a href="http://www.pchart.net/download">baixar o pChart</a>. No zip vem vários arquivos, muitos de exemplos e etc. Só nos  interessa as pastas class, que contém as classes <em>PHP</em> propriamente ditas, fontes com fontes diferenciadas para os rótulos dos gráficos, e palettes com cores predefinidas.</p>
<h5>Gráfico em barra</h5>
<pre class="brush: php; title: ; notranslate">
include(&quot;pChart/class/pData.class.php&quot;);
include(&quot;pChart/class/pImage.class.php&quot;);

$data = new pData();
$data-&gt;addPoints( array( 10 , 20 , 30 , 40 , 30 , 20 , 10 , -10 , -20 , -30 ) , &quot;Valores A&quot; );
$data-&gt;addPoints( array( &quot;Janeiro&quot; , &quot;Fevereiro&quot; , &quot;Março&quot; , &quot;Abril&quot; , &quot;Maio&quot; , &quot;Junho&quot; , &quot;Julho&quot; , &quot;Agosto&quot; , &quot;Setembro&quot; , &quot;Outubro&quot; ) , &quot;Meses&quot; ); 

$data-&gt;setAbscissa(&quot;Meses&quot;);
$data-&gt;setAxisName(0,&quot;Hits&quot;); 

$myPicture = new pImage( 700 , 230 , $data );
$myPicture-&gt;drawRectangle( 0 , 0 , 699 , 229 , array( &quot;R&quot;=&gt;0 , &quot;G&quot;=&gt;0 , &quot;B&quot;=&gt;0 ) ); 

$myPicture-&gt;setFontProperties( array( &quot;FontName&quot;=&gt;&quot;pChart/fonts/pf_arma_five.ttf&quot; , &quot;FontSize&quot;=&gt;6 ) ); 

$myPicture-&gt;setGraphArea(60,40,650,200); 

$scaleSettings = array( &quot;GridR&quot;=&gt;200 , &quot;GridG&quot;=&gt;200 , &quot;GridB&quot;=&gt;200 , &quot;CycleBackground&quot;=&gt;TRUE );
$myPicture-&gt;drawScale($scaleSettings); 

$myPicture-&gt;drawLegend( 580 , 12 , array( &quot;Style&quot;=&gt;LEGEND_NOBORDER , &quot;Mode&quot;=&gt;LEGEND_HORIZONTAL ) ); 

$myPicture-&gt;drawBarChart(); 

$myPicture-&gt;autoOutput('barra.png');
</pre>
<p>Nas linhas 1 e 2 incluímos os arquivos da classes <strong>pData</strong> e <strong>pImage</strong> que iremos utilizar.</p>
<p>Na linha 4 instanciamos um objeto <strong>pData</strong> que é o objeto que representa os dados de nosso gráfico é por ele que adicionaremos os valores no gráfico.</p>
<p>Na linha 5 adicionamos os valores das barras através do método <strong>addPoints</strong> , os valores são adicionados no 1º parâmetro em forma de array e o 2º parâmetro é o rotulo desta série de dados, o <strong>pChart</strong> aceita gráficos com vários séries ou seja várias barras por  intervalo do eixo X.</p>
<p>Na linha 6 adicionamos mais valores, mas estes serão os rótulos que estarão no eixo X(iremos configurar isso na linha 9) então ele deve ter o mesmo número de valores no array dos valores das barras.</p>
<p>Na linha 8 configuramos a serie &#8220;Meses&#8221; como rótulos do eixo X. Na linha 9 definimos o nome do eixo X.</p>
<p>Neste momento já definimos os dados do nosso gráfico agora devemos construir nossa imagem para isso criamos uma instância da classe <strong>pImage</strong> e recebe como parâmetro as dimensões da imagem, no caso a imagem terá 700px de largura e 230px de largura, e passamos também o nosso objeto  que representa os dados do gráfico <strong>$data</strong>.</p>
<p>Na linha 12  utilizamos o método <strong>drawRectangle</strong> para desenhar um retangulo com borda preta ao redor da imagem para delimitar a borda.</p>
<p>Na linha 14 definimos a fonte através do método <strong>setFontProperties</strong> repare que para <em>FontName</em> se esta apontando para um arquivo  da pasta fonts, se deseja utilizar outra fonte para os rótulos do gráfico basta colocar um novo ttf e especificar o caminho neste método, e também podemos definir o tamanho da fonte através do <em>FontSize</em>.</p>
<p>Na linha 16 utilizamos o método <strong>setGraphArea</strong> defimos onde nosso gráfico será desenhado na imagem, lembrando a imagem que iremos  gerar terá 700&#215;230 mas é dentro dela que iremos desenha o gráfico de barras e devemos informar os pontos x,y inicial e x,y final como se estivéssemos desenhado um retângulo.</p>
<p>Na linha 18 definimos as propriedades da escala, que serão utilizadas para desenha-la na linha 20 com o método <strong>drawScale</strong>. A escala é a área que serão desenhadas as barras, os valores GridR, GridG e GridB são os valores de cores das linha que serão desenhadas no fundo e CycleBackground  é para mostrar as linhas de escala.</p>
<p>Na linha 21 desenhamos a legenda do gráfico.</p>
<p>Na linha 23 utilizamos o método <strong>drawBarChart</strong> para desenhar o gráfico propriamente dito, baseado nas configurações feitas anteriormente.</p>
<p>Na linha 25 geramos a imagem do gráfico para isso utilizamos <strong>autoOutput</strong> ela irá gerenciar automaticamente se a imagem deve  ser enviada para o navegador ou ser salva. Mas podemos obrigar o gráfico ser salvo utilizando o método <strong>render</strong>.</p>
<p>Veja o gráfico gerado:</p>
<div style="text-align:center">
<img src="http://www.botecodigital.info/exemplos/pchart/barras.php" alt="Gráfico em barra" />
</div>
<p></p>
<h3>Gráfico em pizza</h3>
<pre class="brush: php; title: ; notranslate">
include(&quot;pChart/class/pData.class.php&quot;);
include(&quot;pChart/class/pPie.class.php&quot;);
include(&quot;pChart/class/pDraw.class.php&quot;);
include(&quot;pChart/class/pImage.class.php&quot;);

$data = new pData();   

$data-&gt;addPoints(array(10,20,30),&quot;Placar&quot;);
$data-&gt;addPoints(array(&quot;A&quot;,&quot;B&quot;,&quot;C&quot;),&quot;Label&quot;);
$data-&gt;setAbscissa(&quot;Label&quot;); 

$myPicture = new pImage(500,300,$data);
$myPicture-&gt;drawRectangle( 0 , 0 , 499 , 299 , array( &quot;R&quot;=&gt;0 , &quot;G&quot;=&gt;0 , &quot;B&quot;=&gt;0 ) );
$myPicture-&gt;setFontProperties( array( &quot;FontName&quot;=&gt;&quot;pChart/fonts/verdana.ttf&quot; , &quot;FontSize&quot;=&gt;18 ) ); 

$PieChart = new pPie($myPicture,$data);
$PieChart-&gt;draw3DPie( 150 , 160 , array( &quot;DrawLabels&quot;=&gt;TRUE , &quot;Border&quot;=&gt;TRUE ) );
$PieChart-&gt;drawPieLegend( 450 , 50 , array( &quot;Style&quot;=&gt;LEGEND_NOBORDER , &quot;Mode&quot;=&gt;LEGEND_VERTICAL ) );
$myPicture-&gt;autoOutput();
</pre>
<p>Para criar um gráfico em pizza utilizamos basicamente os mesmos códigos para criar o objeto de dados <strong>pData</strong> e a imagem <strong>pImage</strong>. </p>
<p>Mas necessitamos criar um objeto <strong>pPie</strong> que é nosso gráfico em pizza, ele recebe como parâmetro do construtor o nosso objeto de imagem e de dados(linha 16).</p>
<p>Na linha 17 desenhamos nosso gráfico em pizza com o método <strong>draw3DPie</strong> que recebe os 2 primeiros parâmetros são a posição do centro do gráfico na imagem. O 3º parâmetro é um array com as opções do gráfico, no caso especificamos que será mostrado os labels no gráfico e que ele terá bordar.</p>
<p>Na linha 18 desenhamos a legenda do gráfico em pizza. Os dois primeiros parâmetros são a posição na imagem e o array contém as opções, no caso, sem bordar e a legenda na horizontal.</p>
<p>Veja como o gráfico ficou:</p>
<div style="text-align:center">
<img src="http://www.botecodigital.info/exemplos/pchart/pizza.php" alt="Gráfico em barra" />
</div>
<p></p>
<h3>Gráfico em linha</h3>
<pre class="brush: php; title: ; notranslate">
include(&quot;pChart/class/pData.class.php&quot;);
include(&quot;pChart/class/pDraw.class.php&quot;);
include(&quot;pChart/class/pImage.class.php&quot;);

$data = new pData();
$data-&gt;addPoints( array( 10 , 20 , 30 , 40 , 30 , 20 ) , &quot;Server A&quot; );
$data-&gt;addPoints( array( &quot;Janeiro&quot; , &quot;Fevereiro&quot; , &quot;Março&quot; , &quot;Abril&quot; , &quot;Maio&quot; , &quot;Junho&quot; ) , &quot;Meses&quot; ); 

$data-&gt;setAbscissa(&quot;Meses&quot;);
$data-&gt;setAxisName(0,&quot;Hits&quot;); 

$myPicture = new pImage(700,230,$data); 

$myPicture-&gt;drawRectangle( 0 , 0 , 699 , 229 , array( &quot;R&quot;=&gt;0 , &quot;G&quot;=&gt;0 , &quot;B&quot;=&gt;0 ) ); 

$myPicture-&gt;setFontProperties( array( &quot;FontName&quot;=&gt;&quot;pChart/fonts/pf_arma_five.ttf&quot; , &quot;FontSize&quot;=&gt;6 ) ); 

$myPicture-&gt;setGraphArea(60,40,650,200); 

$scaleSettings = array( &quot;GridR&quot;=&gt;200 , &quot;GridG&quot;=&gt;200 , &quot;GridB&quot;=&gt;200 , &quot;CycleBackground&quot;=&gt;TRUE );
$myPicture-&gt;drawScale($scaleSettings); 

$myPicture-&gt;drawLegend( 580 , 12 , array( &quot;Style&quot;=&gt;LEGEND_NOBORDER , &quot;Mode&quot;=&gt;LEGEND_HORIZONTAL ) ); 

$myPicture-&gt;drawLineChart(); 

$myPicture-&gt;autoOutput();
</pre>
<p>O gráfico em linha é praticamente igual ao gráfico em barra basta alterar a linha 25 para desenhar com o método <strong>drawLineChart</strong>.</p>
<p>Veja um exemplo do gráfico gerado abaixo:</p>
<div style="text-align:center">
<img src="http://www.botecodigital.info/exemplos/pchart/linha.php" alt="Gráfico em barra" />
</div>
<p>Bom esse é o básico da biblioteca pChart ela é muito completa permitindo vários outros tipos de gráficos como <strong> Barcode</strong>, <strong>Bubble chart</strong>, <strong> Plot chart</strong>, <strong> Polar and radars</strong>, <strong>Progress bars</strong>, <strong>Surface chart</strong>.</p>
<p>Confira a documentação e os exemplos que vem junto com a biblioteca você vai se surpreender!</p>
<p>Era isso até mais e obrigado pelos peixes!</p>
<div id="crp_related"><h4>Posts Relacionados:</h4><ul><li><a href="http://www.botecodigital.info/jquery/trocando-dados-utilizando-json/" rel="bookmark"><img width="50" height="50" src="http://www.botecodigital.info/wp-content/uploads/2010/05/jquery.png" class="crp_thumb wp-post-image" alt="Trocando dados utilizando JSON" title="Trocando dados utilizando JSON" /></a> <a href="http://www.botecodigital.info/jquery/trocando-dados-utilizando-json/" rel="bookmark" class="crp_title">Trocando dados utilizando JSON</a></li><li><a href="http://www.botecodigital.info/css/font-face-utilizando-fontes-alem-do-basico/" rel="bookmark"><img width="50" height="50" src="http://www.botecodigital.info/wp-content/uploads/2010/11/css3.jpg" class="crp_thumb wp-post-image" alt="Font-Face, utilizando fontes além do básico!" title="Font-Face, utilizando fontes além do básico!" /></a> <a href="http://www.botecodigital.info/css/font-face-utilizando-fontes-alem-do-basico/" rel="bookmark" class="crp_title">Font-Face, utilizando fontes além do básico!</a></li><li><a href="http://www.botecodigital.info/jquery/menu-sanfona-com-jquery/" rel="bookmark"><img width="50" height="50" src="http://www.botecodigital.info/wp-content/uploads/2010/05/jquery.png" class="crp_thumb wp-post-image" alt="Menu Sanfona com JQuery" title="Menu Sanfona com JQuery" /></a> <a href="http://www.botecodigital.info/jquery/menu-sanfona-com-jquery/" rel="bookmark" class="crp_title">Menu Sanfona com JQuery</a></li><li><a href="http://www.botecodigital.info/php/cakephp-%e2%80%93-validando-um-formlario-com-model-sem-controller/" rel="bookmark"><img width="50" height="50" src="http://www.botecodigital.info/wp-content/uploads/2010/08/cakephp.png" class="crp_thumb wp-post-image" alt="CakePHP – Validando um formlário com Model sem Controller" title="CakePHP – Validando um formlário com Model sem Controller" /></a> <a href="http://www.botecodigital.info/php/cakephp-%e2%80%93-validando-um-formlario-com-model-sem-controller/" rel="bookmark" class="crp_title">CakePHP – Validando um formlário com Model sem Controller</a></li></ul></div>]]></content:encoded>
			<wfw:commentRss>http://www.botecodigital.info/php/criando-graficos-legais-com-pchart-2-0/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>UruguaianaTECH – Capacitando profissionais</title>
		<link>http://www.botecodigital.info/noticias/uruguaianatech-%e2%80%93-capacitando-profissionais/</link>
		<comments>http://www.botecodigital.info/noticias/uruguaianatech-%e2%80%93-capacitando-profissionais/#comments</comments>
		<pubDate>Thu, 17 Nov 2011 18:56:37 +0000</pubDate>
		<dc:creator>Ziraldo Cardoso</dc:creator>
				<category><![CDATA[Notícias]]></category>
		<category><![CDATA[comunidade]]></category>
		<category><![CDATA[evento]]></category>
		<category><![CDATA[fecomercio]]></category>
		<category><![CDATA[informação]]></category>
		<category><![CDATA[senac]]></category>
		<category><![CDATA[sociedade]]></category>
		<category><![CDATA[tech]]></category>
		<category><![CDATA[uruguaiana]]></category>
		<category><![CDATA[uruguaianatech]]></category>

		<guid isPermaLink="false">http://www.botecodigital.info/?p=1733</guid>
		<description><![CDATA[Eu participei do último UruguaianaTech e gostei muito! É sensacional poder incentivar e divulgar boas idéias… O UruguaianaTECH é um ciclo de palestras que vão fazer de novembro um mês com horizontes mais coloridos e amplos… Com o objetivo de educar para o trabalho em atividades ligadas ao comércio de bens, serviços e turismo, o SENAC Uruguaiana promove nos dias 24 e 25 de novembro o 3º UruguaianaTech (Uruguaiana-RS), evento que visa difundir a utilização da tecnologia nos diversos setores [...]]]></description>
			<content:encoded><![CDATA[<p>Eu participei do último UruguaianaTech e gostei muito! É sensacional poder incentivar e divulgar boas idéias…</p>
<p>O UruguaianaTECH é um ciclo de palestras que vão fazer de novembro um mês com horizontes mais coloridos e amplos…</p>
<p>Com o objetivo de educar para o trabalho em atividades ligadas ao comércio de bens, serviços e turismo, o SENAC Uruguaiana promove nos dias 24 e 25 de novembro o 3º UruguaianaTech (Uruguaiana-RS), evento que visa difundir a utilização da tecnologia nos diversos setores de nossa comunidade.</p>
<p>Sempre conectado às inovações do mercado e atento às novas tendências em tecnologia, o núcleo de TI do Senac Uruguaiana, ministrará palestras sobre os temas: Redes, Edição de Imagens, Ferramentas Forense, Inovações Tecnologicas e Desenvolvimento para Dispositivos Móveis .</p>
<p>Esta edição contará com a presença de profissionais de destaque no mercado da Tecnologia da Informação, com ampla experiência na utilização da tecnologia nos ambientes corporativos e educacionais.O evento será realizado no auditório do Senac Uruguaiana. As inscrições podem ser realizadas através do site <a href="http://www.uruguaianatech.info/" target="_blank">http://www.uruguaianatech.info</a>, mediante colaboração com alimento não perecível.</p>
<p>A grade de palestras já está disponível –> <a href="http://www.uruguaianatech.info/programacao" target="_blank">aqui</a> <–</p>
<p>As inscrições são exclusivamente feitas pelo site e o link já pode ser acessado –> <a href="http://www.uruguaianatech.info/inscricoes" target="_blank">aqui</a> <–</p>
<p>fonte:</p>
<p>http://www.uruguaianatech.info</p>
<div id="crp_related"><h4>Posts Relacionados:</h4><ul><li><a href="http://www.botecodigital.info/noticias/2%c2%ba-uruguaianatech/" rel="bookmark"><img width="50" height="50" src="http://www.botecodigital.info/wp-content/uploads/2009/11/Cuia11.png" class="crp_thumb wp-post-image" alt="2º UruguaianaTech" title="2º UruguaianaTech" /></a> <a href="http://www.botecodigital.info/noticias/2%c2%ba-uruguaianatech/" rel="bookmark" class="crp_title">2º UruguaianaTech</a></li><li><a href="http://www.botecodigital.info/php/1%c2%ba-uruguaianatech/" rel="bookmark"><img width="50" height="50" src="http://www.botecodigital.info/wp-content/uploads/2009/11/Cuia11.png" class="crp_thumb wp-post-image" alt="1º UruguaianaTech" title="1º UruguaianaTech" /></a> <a href="http://www.botecodigital.info/php/1%c2%ba-uruguaianatech/" rel="bookmark" class="crp_title">1º UruguaianaTech</a></li><li><a href="http://www.botecodigital.info/php/tchelinux-uruguaiana/" rel="bookmark"><img width="50" height="50" src="http://www.botecodigital.info/wp-content/uploads/2010/08/tchelinux-150x150.png" class="crp_thumb wp-post-image" alt="TchêLinux Uruguaiana" title="TchêLinux Uruguaiana" /></a> <a href="http://www.botecodigital.info/php/tchelinux-uruguaiana/" rel="bookmark" class="crp_title">TchêLinux Uruguaiana</a></li><li><a href="http://www.botecodigital.info/php/uruguaianatech/" rel="bookmark"><img width="50" height="50" src="http://www.botecodigital.info/wp-content/uploads/2009/11/urutech1.png" class="crp_thumb wp-post-image" alt="UruguaianaTech" title="UruguaianaTech" /></a> <a href="http://www.botecodigital.info/php/uruguaianatech/" rel="bookmark" class="crp_title">UruguaianaTech</a></li></ul></div>]]></content:encoded>
			<wfw:commentRss>http://www.botecodigital.info/noticias/uruguaianatech-%e2%80%93-capacitando-profissionais/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Aumentando a segurança com SendEmail</title>
		<link>http://www.botecodigital.info/linux/aumentando-a-seguranca-com-sendmail/</link>
		<comments>http://www.botecodigital.info/linux/aumentando-a-seguranca-com-sendmail/#comments</comments>
		<pubDate>Wed, 16 Nov 2011 01:32:53 +0000</pubDate>
		<dc:creator>Ziraldo Cardoso</dc:creator>
				<category><![CDATA[Dicas]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[/root]]></category>
		<category><![CDATA[acesso por root]]></category>
		<category><![CDATA[comando]]></category>
		<category><![CDATA[e-mail]]></category>
		<category><![CDATA[email]]></category>
		<category><![CDATA[eviar email terminal]]></category>
		<category><![CDATA[notificação]]></category>
		<category><![CDATA[segurança]]></category>
		<category><![CDATA[sendEmail]]></category>
		<category><![CDATA[sendmail]]></category>
		<category><![CDATA[usuário administrativo]]></category>

		<guid isPermaLink="false">http://www.botecodigital.info/?p=1679</guid>
		<description><![CDATA[Conheço bem algumas das necesidades básicas de quem gerencia uma rede: Ficar informado sobre dados que entram e saem via internet; Consultar os logs de forma eficiente e com regularidade; Aplicar de modo construtivo as informações obtidas pelos logs; e Controlar e restringir o acesso do usuário administrativo (root). Sei que apresentar soluções para todas as necessidades requer um pouco de estudo e bastante tempo para testes. Isso porque nem sempre uma ferramenta/aplicativo usado por um determinado gerente de redes [...]]]></description>
			<content:encoded><![CDATA[<p>Conheço bem algumas das necesidades básicas de quem gerencia uma rede:</p>
<ul>
<li> Ficar informado sobre dados que entram e saem via internet;</li>
<li> Consultar os logs de forma eficiente e com regularidade; </li>
<li> Aplicar de modo construtivo as informações obtidas pelos logs; e </li>
<li> Controlar e restringir o acesso do usuário administrativo (root).</li>
</ul>
<p>Sei que apresentar soluções para todas as necessidades requer um pouco de estudo e bastante tempo para testes. Isso porque nem sempre uma ferramenta/aplicativo usado por um determinado gerente de redes vai ser igualmente eficiente para todos os outros interessados no assunto. E infelizmente, nesse post, não trarei uma &#8220;resposta mágica&#8221; para todos os nossos anseios. Mas uma coisa sei: o sendEmail pode fazer mais por você do que pode-se imaginar!</p>
<p>De modo simples quero me concentar em um único ponto: &#8220;Controlar e restringir o acesso do usuário administrativo (root)&#8221;.</p>
<p>Para isso, vamos usar o sendEmail: que na verdade é simplesmente um cliente de email que usa protocolo SMTP para enviar mensagens via linha de comando. Mas afinal de contas: como aumentar a segurança com esta ferramenta?</p>
<p>Para se obter e usar o sendEmail é só seguir os padrões Unix like (Linux) usados em toda a Galáxia:<br />
&#8211;> instalação manual/compilação &#8211;> tá aqui o <a href="http://caspian.dotconf.net/menu/Software/SendEmail/" target="_blank">binário do pacote</a> <--<br />
--> gerenciadores de pacote modernos: apt, yum, etc. Para quem usa distros Debian ou baseadas em Debian (Ubuntu, Knoppix, Xandros, etc) é só manter os repositórios regulares e usar o conhecido comando:</p>
<pre class="brush: plain; title: ; notranslate">apt-get install sendEmail</pre>
<p>* não se esqueça do &#8220;E&#8221; na palavra sendEmail<br />
O.B.S: após a instalação do sendEmail via apt não há, inicialmente, necessidade da modificação de nenhum arquivo conf.(deixe tudo nativo).</p>
<p>Depois acesse seu sistema como root:</p>
<pre class="brush: plain; title: ; notranslate">su</pre>
<p>Vá até a pasta pessoal do usuário corrente (ou seja, do root):</p>
<pre class="brush: plain; title: ; notranslate">cd ~ </pre>
<p>Agora liste todos os arquivos ocultos:</p>
<pre class="brush: plain; title: ; notranslate">ls -a </pre>
<p>Nossos alvos são os seguintes arquivos:</p>
<p>.bashrc (arquivo que é lido e carregado durante a entrada do usuário no sistema)<br />
.bash_logout (arquivo que é lido e carregado durante saída do usuário do sistema)<br />
.bash_history (arquivo que &#8220;reserva&#8221; os últimos comandos executados pelo corrente usuário no terminal) </p>
<p>Caso os arquivos citdos não existam é só criá-los que automaticamente de tornam funcionais:</p>
<pre class="brush: plain; title: ; notranslate">touch .bash_history</pre>
<p> ou</p>
<pre class="brush: plain; title: ; notranslate">touch .bash_logout</pre>
<p>Vamos ao comando direcionado para o sendEmail:</p>
<pre class="brush: plain; title: ; notranslate">sendEmail -f nome_do_host_a_ser_monitorado@seu.dominio -t seu_usuario@seu.email -u &quot;Alerta: Entrada de root por `who | cut -d&quot;(&quot; -f2 | cut -d&quot;)&quot; -f1`&quot; -m &quot;Acesso por root em host_alvo 192.168.X.X&quot; -a /home/arquivo -s protocolo_envio@seu_email:porta_usada -xu usuário_do_seu_email -xp senha_do_seu_email 1&gt; /dev/tty7</pre>
<p>Explicando os parâmetros:</p>
<p>-f &#8211;> endereço daquele que envia o email (exemplo: proxy@minha_empresa.com.br)<br />
-t &#8211;> endereço daquele que receberá o email (exemplo: ziraldocardoso@gmail.com)<br />
-u &#8211;> título da mensagem (aqui existe o comando &#8220;<b>who</b>&#8221; adicional que envia o IP da máquina que logou por SSH, por exemplo. Não modifique se deseja manter essa função).<br />
-m &#8211;> a menssagem em si (exemplo: Acesso por root em proxy IP 192.168.2.101)<br />
-a &#8211;> arquivo para anexar. Especifique um anexo se desejar (usado no logout. As 35 linhas finais do .bash_history são anexadas)<br />
-s &#8211;> protocolo para envio de mensagem seguido de : porta. Cada webmail tem as suas próprias especificações. É só olhar nas opções do Yahoo, Gmail ou outro e liberar o recebimento por aplicativo de envio automático (Thunderbird, MS Outlook, etc). (exemplo: smtp.minha_empresa.gov.br:25)<br />
-xu &#8211;> seu nome de usuário do webmail que vai receber o email (exemplo: ziraldo@gmail.com ou somente ziraldo)<br />
-xp &#8211;> sua senha de usuário do webmail<br />
1> /dev/tty7 &#8211;> redirecionamento da saída de tela para outro terminal. Não é algo elegante ter sempre uma descrição de envio de email pelo sendmail toda vez que se entra ou sai do sistema. E outra, um possível invasor não precisa saber que o admin está sendo notificado de sua invasão. (Você pode usar outro recurso se desejar)</p>
<p>Agora é só incluir essa &#8220;parafernalha&#8221; no final do arquivo .bashrc para notificação de login via email. Use seu editor de texto preferido e retire o parâmetro para anexo (-a). Exemplo:</p>
<pre class="brush: plain; title: ; notranslate">sendEmail -f nome_do_host_a_ser_monitorado@seu.dominio -t seu_usuario@seu.email -u &quot;Alerta: Entrada de root por `who | cut -d&quot;(&quot; -f2 | cut -d&quot;)&quot; -f1`&quot; -m &quot;Acesso por root em host_alvo 192.168.X.X&quot; -s protocolo_de _envio@seu_email:porta_usada -xu usuário_do_seu_email -xp senha_do_seu_email 1&gt; /dev/tty7</pre>
<p>Para o logout usa-se um recurso um pouco diferente: vamos anexar o arquivo .bash_history ao email enviado. É muito interessante poder saber quais foram os últimos comandos executados no terminal. Sei que qualquer invasor que se preze apaga o .bash_history e não executa &#8220;exit&#8221; (comentário feito por Thiago Finardi). Mas eu insisto nisso&#8230; Sabe o porquê? Porque na minha sala de TI trabalham várias pessoas que executam diversos comandos em diferentes terminais. Caso haja algum problema e eu não esteja no trabalho, posso dar imediato suporte porque os últimos comandos foram enviados para o meu email. <img src='http://www.botecodigital.info/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' />  (fica frio, chefe!)</p>
<p>Edite o .bash_logout e na última linha inclua:</p>
<pre class="brush: plain; title: ; notranslate">sh /home/saida.bash_history</pre>
<p>*o nome do arquivo e o caminho podem variar de acordo com sua necessidade.</p>
<p>Crie o arquivo referenciado no local especificado acima:</p>
<pre class="brush: plain; title: ; notranslate">touch /home/saida.bash_history</pre>
<p>Crie um arquivo que em breve será usado como anexo:</p>
<pre class="brush: plain; title: ; notranslate">touch /home/resumo.bash_history</pre>
<p>*o nome do arquivo e o caminho podem variar de acordo com sua necessidade.</p>
<p>Agora edite o arquivo saida.bash_history conforme o exemplo:</p>
<pre class="brush: plain; title: ; notranslate">tail -n 35 /root/.bash_history &gt; /home/resumo.bash_history</pre>
<pre class="brush: plain; title: ; notranslate">sendEmail -f nome_do_host_a_ser_monitorado@seu.dominio -t seu_usuario@seu.email -u &quot;Alerta: Entrada de root por `who | cut -d&quot;(&quot; -f2 | cut -d&quot;)&quot; -f1`&quot; -m &quot;Acesso por root em host_alvo 192.168.X.X&quot; -a /home/resumo.bash_history -s protocolo_envio@seu_email:porta_usada -xu usuário_do_seu_email -xp senha_do_seu_email 1&gt; /dev/tty7</pre>
<p>*o comando &#8220;<b>tail</b>&#8221; usado acima serve para exportar as últimas 35 linhas do .bash_history para o resumo.bash_history que servirá de anexo para o logout.</p>
<p>Considerações finais:</p>
<p>Teste quantas vezes for necessário até ter certeza do funcioanamento. Suprima a parte &#8220;<b>1> /dev/tty7</b>&#8221; durante a fase de implantação para que você possa observar todas as saídas de tela e ter certeza do funcionamento do sendEmail. Use sempre o comando &#8220;<b>exit</b>&#8221; para o logout e  consequente execução do arquivo .bash_logout. Digo ainda que a pior parte é fazer os servidores do Yahoo, bol, Gmail, etc não rejeitarem o email enviado pelo sendEmail. Por causa disso acabei por usar um email organizacional não tão bom, mas que recebe tudo tranquilamente.</p>
<p>fontes:</p>
<p>man sendEmail<br />
<a href="http://caspian.dotconf.net/menu/Software/SendEmail/" target="_blank">http://caspian.dotconf.net/menu/Software/SendEmail/</a><br />
<a href="http://www.vivaolinux.com.br/artigo/Enviando-emails-pelo-terminal/?pagina=1" target="_blank">http://www.vivaolinux.com.br</a><br />
<a href="http://www.centraldolinux.org/notificacao-por-email-de-acesso-do-root/" target="_blank">http://www.centraldolinux.org</a></p>
<div id="crp_related"><h4>Posts Relacionados:</h4><ul><li><a href="http://www.botecodigital.info/linux/fixando-ip-ao-endereco-mac-nos-hosts-de-uma-lan/" rel="bookmark"><img width="50" height="50" src="http://www.botecodigital.info/wp-content/uploads/2011/11/ip_mac.png" class="crp_thumb wp-post-image" alt="Fixando IP ao endereço MAC nos hosts de uma LAN" title="Fixando IP ao endereço MAC nos hosts de uma LAN" /></a> <a href="http://www.botecodigital.info/linux/fixando-ip-ao-endereco-mac-nos-hosts-de-uma-lan/" rel="bookmark" class="crp_title">Fixando IP ao endereço MAC nos hosts de uma LAN</a></li><li><a href="http://www.botecodigital.info/outros/recuperando-a-senha-de-root-do-mysql/" rel="bookmark"><img width="50" height="50" src="http://www.botecodigital.info/wp-content/uploads/2010/09/mysql_logo.png" class="crp_thumb wp-post-image" alt="Recuperando a senha de root  do MySQL" title="Recuperando a senha de root  do MySQL" /></a> <a href="http://www.botecodigital.info/outros/recuperando-a-senha-de-root-do-mysql/" rel="bookmark" class="crp_title">Recuperando a senha de root  do MySQL</a></li><li><a href="http://www.botecodigital.info/php/enviando-email-com-phpmailer/" rel="bookmark"><img width="50" height="50" src="http://www.botecodigital.info/wp-content/uploads/2010/04/php.png" class="crp_thumb wp-post-image" alt="Enviando email com PHPmailer" title="Enviando email com PHPmailer" /></a> <a href="http://www.botecodigital.info/php/enviando-email-com-phpmailer/" rel="bookmark" class="crp_title">Enviando email com PHPmailer</a></li><li><a href="http://www.botecodigital.info/linux/instalando-g210m-no-ubuntu-e-debian/" rel="bookmark"><img width="50" height="50" src="http://www.botecodigital.info/wp-content/uploads/2010/06/linux2.png" class="crp_thumb wp-post-image" alt="Instalando G210m no Ubuntu e Debian" title="Instalando G210m no Ubuntu e Debian" /></a> <a href="http://www.botecodigital.info/linux/instalando-g210m-no-ubuntu-e-debian/" rel="bookmark" class="crp_title">Instalando G210m no Ubuntu e Debian</a></li></ul></div>]]></content:encoded>
			<wfw:commentRss>http://www.botecodigital.info/linux/aumentando-a-seguranca-com-sendmail/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Fixando IP ao endereço MAC nos hosts de uma LAN</title>
		<link>http://www.botecodigital.info/linux/fixando-ip-ao-endereco-mac-nos-hosts-de-uma-lan/</link>
		<comments>http://www.botecodigital.info/linux/fixando-ip-ao-endereco-mac-nos-hosts-de-uma-lan/#comments</comments>
		<pubDate>Sun, 06 Nov 2011 02:10:38 +0000</pubDate>
		<dc:creator>Ziraldo Cardoso</dc:creator>
				<category><![CDATA[Dicas]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[arp]]></category>
		<category><![CDATA[debian]]></category>
		<category><![CDATA[dhcp]]></category>
		<category><![CDATA[fixando ip mac]]></category>
		<category><![CDATA[ip]]></category>
		<category><![CDATA[mac]]></category>
		<category><![CDATA[servidor]]></category>

		<guid isPermaLink="false">http://www.botecodigital.info/?p=1653</guid>
		<description><![CDATA[Depois de ler diversas opiniões em vários fóruns e depois de seguir alguns tutoriais que, infelizmente, não resolveram minha simples pendência, resolvi resumir este assunto.” Contexto Geral: –&#62; Trabalho em uma rede com aprox. 100 hosts ligados a um servidor DHCP (mais exatamente dhcp3-server + Debian “Lenny”); e –&#62; Meu DHCP está configurado de forma que os IP’s são distribuídos conforme as seguintes linhas do dhcpd.conf: #esse é um pequeno trecho de minha conf# #De modo simples, essas linhas querem [...]]]></description>
			<content:encoded><![CDATA[<p>Depois de ler diversas opiniões em vários fóruns e depois de seguir alguns tutoriais que, infelizmente, não resolveram minha simples pendência, resolvi resumir este assunto.”</p>
<p><strong>Contexto Geral: </strong></p>
<p>–&gt; Trabalho em uma rede com aprox. 100 hosts ligados a um servidor DHCP (mais exatamente dhcp3-server + Debian “Lenny”); e<br />
–&gt; Meu DHCP está configurado de forma que os IP’s são distribuídos conforme as seguintes linhas do dhcpd.conf:</p>
<p>#esse é um pequeno trecho de minha conf#</p>
<pre class="brush: plain; title: ; notranslate">
host NOME_DO_HOST {
hardware ethernet NUMERO_MAC (ex.: 00:12:13:25:aa:c7);
fixed-address 192.168.1.X (ex.: 1 a 254);
}
</pre>
<p>#De modo simples, essas linhas querem dizer que um determinado MAC de placa de rede atende sempre por um determinado IP em minha LAN.#<br />
#Acho essa conf fantástica. Isso porque não preciso ficar configurando IP manualmente nos clientes. Qualquer host que eu cadastre no /etc/dhcp3/dhcpd.conf recebe um IP de forma automática quando ligado a um dos cabos da LAN. Bão demais!#</p>
<p><strong>Problema encontrado pelo admin da rede:</strong></p>
<p>–&gt; Se uma pessoa qualquer colocasse na rede seu PC, não previamente cadastrado no dhcpd.conf do servidor, ela não conseguiria ter acesso a nada na rede; mas<br />
–&gt; Se essa mesma pessoa desse uma “olhada” mais de perto em outros hosts já cadastrados na rede, ela poderia deduzir um número IP qualquer não utilizado (entre 1 e 254) e colocá-lo manualmente no seu “cliente clandestino”.<br />
–&gt; Conclusão: Acesso permitido!</p>
<p><strong>Como contornar o problema:</strong></p>
<p>–&gt; Crie um arquivo chamado ethers (o nome não pode variar) no diretório /etc.<br />
–&gt; Edite o arquivo ethers conforme o exemplo abaixo:</p>
<p>#IP  espaço MAC</p>
<pre class="brush: plain; title: ; notranslate">
192.168.1.1 00:23:00:c4:25:c4
…
192.168.1.254 00:00:00:00:00:00
</pre>
<p>#Ou seja, IP desejado (conforme sua rede) + MAC conforme aquele do cartão de rede. Os IP’s que ainda não tiverem cliente devem ser preenchidos com full zeros no MAC (00: … :00). Isso porque MAC com “tudo zero” não funciona em uma rede e uma possível clonagem não lograria êxito. Obs.: Caso você deixe algum IP sem MAC, haverá uma vulnerabilidade no “esquema”. Então, tem que se digitar MAC para todos os possíveis IP’s da rede!#</p>
<p>–&gt; Ainda no diretório /etc, crie um arquivo (com qualquer nome) e dê permissão de execução (ex.: touch ip_mac. Depois, chmod +x ip_mac).<br />
–&gt; Edite esse arquivo e dentro dele digite o seguinte comando:</p>
<pre class="brush: plain; title: ; notranslate">arp -f </pre>
<p>#Ou seja, esse é o comando que fixa o IP ao MAC e usa por padrão o arquivo ethers como referência#<br />
–&gt; Agora só falta colocar o arquivo ip_mac para ser inicializado no boot do seu S.O. Com isso garantimos que o comando arp -f será executado em todos as reinicializações de forma automática.<br />
–&gt; Se sua “distro” for derivada do Debian (ex.: Ubuntu, Knoppix, Linspire, etc) é só buscar pelo arquivo /etc/init.d/bootmisc.sh. (Pode ser que ele não esteja exatamente neste diretório. Então é só procurar por ele usando os comandos find e locate, por exemplo.)<br />
–&gt; Se sua “distro” não for da “linha” Debian, faça uma breve pesquisa para saber quais são os meios de se inicializar um script de forma automática no boot (existem muitas outras formas).<br />
–&gt; Edite o bootmisc.sh e escreva o endereço do arquivo com permissão de execução que foi criado anteriormente: /etc/ip_mac. Depois salve.</p>
<p>–&gt; Para saber se tudo está funcionado é só digitar o comando <strong>arp -a</strong> e todos os IP’s que estiverem fixos ao seu respectivo MAC vão aparecer como neste exemplo:</p>
<pre class="brush: plain; title: ; notranslate">
? (192.168.1.118) em 00:c4:54:18:a7:c8 [ether] PERM em eth1
</pre>
<p>#”Fique de olho” na palavra PERM. Os IP’s não fixados ao MAC, em um sistema DHCP, aparecem sem PERM na saída do comando arp -a. Exemplo:</p>
<pre class="brush: plain; title: ; notranslate">
? (192.168.1.118) em 00:c4:54:18:a7:c8 [ether] em eth1
</pre>
<p>–&gt; Conclusão: Problema contornado.</p>
<p><strong>Fontes:</strong><br />
wandersonbpaula em http://www.vivaolinux.com.br</p>
<p>http://pt.wikipedia.org/wiki/Address_Resolution_Protocol</p>
<p>/usr/share/doc/dhcp3-server/examples/dhcpd.conf</p>
<div id="crp_related"><h4>Posts Relacionados:</h4><ul><li><a href="http://www.botecodigital.info/linux/servidor-dhcp-no-debian-squeeze/" rel="bookmark"><img width="50" height="50" src="http://www.botecodigital.info/wp-content/uploads/2010/06/linux.png" class="crp_thumb wp-post-image" alt="Servidor dhcp no Debian Squeeze" title="Servidor dhcp no Debian Squeeze" /></a> <a href="http://www.botecodigital.info/linux/servidor-dhcp-no-debian-squeeze/" rel="bookmark" class="crp_title">Servidor dhcp no Debian Squeeze</a></li><li><a href="http://www.botecodigital.info/linux/aumentando-a-seguranca-com-sendmail/" rel="bookmark"><img width="50" height="50" src="http://www.botecodigital.info/wp-content/uploads/2011/11/send_email_user_alternative-150x150.png" class="crp_thumb wp-post-image" alt="Aumentando a segurança com SendEmail" title="Aumentando a segurança com SendEmail" /></a> <a href="http://www.botecodigital.info/linux/aumentando-a-seguranca-com-sendmail/" rel="bookmark" class="crp_title">Aumentando a segurança com SendEmail</a></li><li><a href="http://www.botecodigital.info/linux/ajustar-horario-de-verao-no-debian-ubuntu/" rel="bookmark"><img width="50" height="17" src="http://www.botecodigital.info/wp-content/uploads/2011/10/logo-ntp.gif" class="crp_thumb wp-post-image" alt="Ajustar horário de verão no Debian / Ubuntu" title="Ajustar horário de verão no Debian / Ubuntu" /></a> <a href="http://www.botecodigital.info/linux/ajustar-horario-de-verao-no-debian-ubuntu/" rel="bookmark" class="crp_title">Ajustar horário de verão no Debian / Ubuntu</a></li><li><a href="http://www.botecodigital.info/linux/instalando-g210m-no-ubuntu-e-debian/" rel="bookmark"><img width="50" height="50" src="http://www.botecodigital.info/wp-content/uploads/2010/06/linux2.png" class="crp_thumb wp-post-image" alt="Instalando G210m no Ubuntu e Debian" title="Instalando G210m no Ubuntu e Debian" /></a> <a href="http://www.botecodigital.info/linux/instalando-g210m-no-ubuntu-e-debian/" rel="bookmark" class="crp_title">Instalando G210m no Ubuntu e Debian</a></li></ul></div>]]></content:encoded>
			<wfw:commentRss>http://www.botecodigital.info/linux/fixando-ip-ao-endereco-mac-nos-hosts-de-uma-lan/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Protegendo arquivos de download com login</title>
		<link>http://www.botecodigital.info/php/protegendo-arquivos-de-download-com-login/</link>
		<comments>http://www.botecodigital.info/php/protegendo-arquivos-de-download-com-login/#comments</comments>
		<pubDate>Wed, 02 Nov 2011 20:03:39 +0000</pubDate>
		<dc:creator>Rodrigo Aramburu</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[download]]></category>
		<category><![CDATA[login]]></category>

		<guid isPermaLink="false">http://www.botecodigital.info/?p=1637</guid>
		<description><![CDATA[Em algum momento necessitamos disponibilizar um arquivo para download somente para usuários cadastrados em nosso site. E como sabemos, simplesmente colocar estes arquivos em um pasta que possa ser acessado por URL do site não é uma ideia muito segura, pois mesmo se você disponibilizar o link de download somente para seu usuário logado, nada impede de uma outra pessoa “adivinhar” o caminho de download. Um usuário pode acessar diretamente a pasta de downloads e se seu diretório não conter [...]]]></description>
			<content:encoded><![CDATA[<p>Em algum momento necessitamos disponibilizar um arquivo para download somente para usuários cadastrados em nosso site. E como sabemos, simplesmente colocar estes arquivos em um pasta que possa ser acessado por URL do site não é uma ideia muito segura, pois mesmo se você disponibilizar o link de download somente para seu usuário logado, nada impede de uma outra pessoa “adivinhar” o caminho de download. Um usuário pode acessar diretamente a pasta de downloads e se seu diretório não conter um arquivo <em>index</em> ou o servidor apache não estiver configurado para não listar os arquivos(a maioria lista) o usuário verá seus arquivos, mesmo se não for possível listar os arquivos, o usuário mal intencionado pode ainda ir tentando nomes de arquivos por força bruta até acertar. Se o arquivo estiver dentro da pasta publica do apache ele pode ser acessado e baixado pelo navegador, você pode dificultar bastante, mas se o usuário descobrir o nome ele pode baixar.</p>
<p>Para remediar isso podemos colocar os arquivos de download fora da pasta de arquivos publicos do apache, sendo assim não acessíveis via URL diretamente, mas nos possibilitando criar um  script de download que verifique se o usuário esta logado ou se tem permissão de baixar, se estiver leia o arquivo do sistema de arquivo e envie para download para o usuário.</p>
<p>Para nosso exemplo iremos utilizar a seguinte estrutura de diretórios:</p>
<ul>
<li>public_html
<ul>
<li>index.php</li>
<li>login.php</li>
<li>logout.php</li>
<li>download.php</li>
</ul>
</li>
<li>downloads
<ul>
<li>putty.exe</li>
</ul>
</li>
</ul>
<p>Como você deve saber, na maioria das hospedagens os arquivos visíveis do nosso site  são colocados na pata public_html ou www . Sendo assim os arquivos da pasta downloads não esta publicada na web mas nossos scripts podem acessá-los via sistema de arquivos do servidor.</p>
<p>Antes de vermos o arquivo download.php que é o que realmente importa, vamos ver os arquivos de login, logut e index, que são bem simples e servem somente para este exemplo, se você quiser um <a href="http://www.botecodigital.info/php/exemplo-de-autenticacao-parte-1/">exemplo de sistema de login pode ver em outro post</a>.</p>
<h6>index.php</h6>
<pre class="brush: php; title: ; notranslate">
&lt;?php
  session_start();
?&gt;&lt;html&gt;
  &lt;head&gt;
      &lt;meta charset=&quot;UTF-8&quot;&gt;
      &lt;title&gt;Teste protegendo download autenticado&lt;/title&gt;
  &lt;/head&gt;

  &lt;body&gt;
    &lt;?php if ( $_SESSION['logado'] == &quot;true&quot; ){ ?&gt;
	&lt;p&gt;Você está logado&lt;/p&gt;
	&lt;a href=&quot;logout.php&quot;&gt;logout&lt;/a&gt;
    &lt;?php }else{ ?&gt;
	Você &lt;strong&gt;não&lt;/strong&gt; está logado!!!
	&lt;a href=&quot;login.php&quot;&gt;login&lt;/a&gt;
    &lt;?php } ?&gt;

  &lt;a href=&quot;download.php?download=putty.exe&quot;&gt;Download putty.exe&lt;/a&gt;
  &lt;/body&gt;
&lt;/html&gt;
</pre>
<p></p>
<h6>login.php</h6>
<pre class="brush: php; title: ; notranslate">
&lt;?php
  session_start();

  $_SESSION['logado'] = 'true';

  header('location: index.php');
?&gt;
</pre>
<p></p>
<h6>logout.php</h6>
<pre class="brush: php; title: ; notranslate">
&lt;?php
  session_start();

  unset($_SESSION['logado']);

  header('location: index.php');
?&gt;
</pre>
<p>Os arquivos acima são bem simples, acredito que não necessite de maiores explicações. Então vamos ao que interessa:</p>
<h6>download.php</h6>
<pre class="brush: php; title: ; notranslate">
&lt;?php
session_start();

if( $_SESSION['logado'] == 'true' ){

	$download = $_GET['download'];
	if( is_file( '/home/boteco/downloads/'.$download ) ){
		$filename = '/home/boteco/downloads/'.$download;

		$finfo = finfo_open(FILEINFO_MIME_TYPE);
		$type = finfo_file($finfo, $filename);
		header('Content-type: '.$type);
		header('Content-Disposition: attachment; filename=&quot;'.$download.'&quot;');

		readfile($filename);
	}else{
		echo &quot;arquivo nao encontrado&quot;;
	}

}else{
	echo &quot;Você não estaa logado. Faça o login para efetuar o download.&quot;;
}

?&gt;
</pre>
<p>Na linha 2 chamamos a função <em>session_start()</em> para podermos ler e gravar informação na sessão.</p>
<p>Na linha 4 testamos se o usuário que acessou esta logado na sessão, se o usuário pode fazer o download.</p>
<p>Na linha 6 pegamos o nome do arquivo que recebemos via parâmetro <em>GET</em> da URL, como vimos no arquivo <em>index.php</em> na linha 18 para fazer o download chamamos <em>download.php?download=putty.exe</em> então queremos baixar o arquivo <em>putty.exe</em>.</p>
<p>Na linha 7 verificamos se o arquivo que recebemos por parâmetro existe e é um arquivo, você deve ter notado que utilizamos o caminho absoluto da pasta de download e concatenamos com o nome  do arquivo recebido. </p>
<p>Na linha 8 armazenamos o nome absoluto do arquivo em uma variável para facilitar a manipulação.</p>
<p>Na linha 10  criamos um recurso fileinfo, para ser utilizado para ler o mime-type do arquivo.</p>
<p>Linha 11 lemos o MIME-TYPE do arquivo e armazenamos em uma variável, necessitamos pegar o MIME-TYPE do arquivo pois o nosso script de download possui o MIME-TYPE <strong>text/x-php</strong> e o comportamento do navegador para este MIME-<br />
TYPE é mostrá-lo e não baixá-lo, se deixarmos o MIME em <strong>text/x-php</strong> e jogarmos o contudo do arquivo para o navegador, veremos o código binário do programa, ou seja, um monte de caracteres estranhos.</p>
<p>Na linha 12 modificamos o MIME do nosso script para o MIME lido do arquivo.</p>
<p>Na linha 13 forçamos o arquivo ser baixado com o nome recebido por parâmetro, lembrando, se não forçarmos ele irá utilizar o nome do script o que não seria algo legal <img src='http://www.botecodigital.info/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />   .</p>
<p>Na linha 15 utilizamos a função <em>redfile</em> que lê um arquivo e exibe ele na tela, como já modificamos o header do arquivo para um outro MIME e para forçar o download o arquivo será lido do sistema de arquivo e enviado para o usuário.</p>
<p><strong>OBS:</strong> Só lembrando, a função <em>finfo_open</em> só está disponível no <strong>PHP >= 5.3.0</strong>, se você utilizar uma versão anterior pode utilizar <em>mime_content_type</em> mas lembre-se de verificar se ela está disponível na sua hospedagem, na minha por exemplo não está e não estou com vontade de me incomodar com eles, fiquei somente com o teste local.</p>
<p>Bom era isso pessoal. </p>
<div id="crp_related"><h4>Posts Relacionados:</h4><ul><li><a href="http://www.botecodigital.info/php/exemplo-de-autenticacao-parte-2/" rel="bookmark"><img width="50" height="50" src="http://www.botecodigital.info/wp-content/uploads/2010/04/php.png" class="crp_thumb wp-post-image" alt="Exemplo de autenticação em PHP utilizando sessão- Parte 2" title="Exemplo de autenticação em PHP utilizando sessão- Parte 2" /></a> <a href="http://www.botecodigital.info/php/exemplo-de-autenticacao-parte-2/" rel="bookmark" class="crp_title">Exemplo de autenticação em PHP utilizando sessão- Parte 2</a></li><li><a href="http://www.botecodigital.info/php/urls-amigaveis/" rel="bookmark"><img width="50" height="50" src="http://www.botecodigital.info/wp-content/uploads/2010/04/php.png" class="crp_thumb wp-post-image" alt="URLs amigáveis" title="URLs amigáveis" /></a> <a href="http://www.botecodigital.info/php/urls-amigaveis/" rel="bookmark" class="crp_title">URLs amigáveis</a></li><li><a href="http://www.botecodigital.info/php/listando-arquivos-de-um-diretorio-em-php/" rel="bookmark"><img width="50" height="50" src="http://www.botecodigital.info/wp-content/uploads/2010/04/php.png" class="crp_thumb wp-post-image" alt="Listando arquivos de um diretório em PHP" title="Listando arquivos de um diretório em PHP" /></a> <a href="http://www.botecodigital.info/php/listando-arquivos-de-um-diretorio-em-php/" rel="bookmark" class="crp_title">Listando arquivos de um diretório em PHP</a></li><li><a href="http://www.botecodigital.info/php/criando-um-captcha-em-php/" rel="bookmark"><img width="50" height="50" src="http://www.botecodigital.info/wp-content/uploads/2010/04/php.png" class="crp_thumb wp-post-image" alt="Criando um CAPTCHA em PHP" title="Criando um CAPTCHA em PHP" /></a> <a href="http://www.botecodigital.info/php/criando-um-captcha-em-php/" rel="bookmark" class="crp_title">Criando um CAPTCHA em PHP</a></li></ul></div>]]></content:encoded>
			<wfw:commentRss>http://www.botecodigital.info/php/protegendo-arquivos-de-download-com-login/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Conectando Java com MongoDB</title>
		<link>http://www.botecodigital.info/java/conectando-java-com-mongodb/</link>
		<comments>http://www.botecodigital.info/java/conectando-java-com-mongodb/#comments</comments>
		<pubDate>Thu, 20 Oct 2011 03:12:24 +0000</pubDate>
		<dc:creator>Rodrigo Aramburu</dc:creator>
				<category><![CDATA[BD]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[banco de dados]]></category>
		<category><![CDATA[dados]]></category>
		<category><![CDATA[db]]></category>
		<category><![CDATA[mongodb]]></category>
		<category><![CDATA[nosql]]></category>

		<guid isPermaLink="false">http://www.botecodigital.info/?p=1606</guid>
		<description><![CDATA[Vimos em um post passado o MongoDB e agora vamos ver como conectamos a ele em Java. Antes de qualquer coisa temos de baixar o driver e para isso basta baixá-lo da área de drivers do site do MongoDB e adicioná-lo ao seu classpath. Conectar ao MongoDB é bastante simples, basta instanciar a classe Mongo e depois selecionar o banco. Acredito que a parte mais complicada é transformar um documento no estilo JSON em um objeto BasicDBObject que a maioria [...]]]></description>
			<content:encoded><![CDATA[<p>Vimos em um <a href="http://www.botecodigital.info/bd-2/nosql-mongodb/">post passado o MongoDB</a> e agora vamos ver como conectamos a ele em Java.</p>
<p>Antes de qualquer coisa temos de baixar o driver e para isso basta baixá-lo da <a href="http://www.mongodb.org/display/DOCS/Java+Language+Center">área de drivers do site do MongoDB</a> e adicioná-lo ao seu classpath.</p>
<p>Conectar ao MongoDB é bastante simples, basta instanciar a classe Mongo e depois selecionar o banco.</p>
<pre class="brush: java; title: ; notranslate">
Mongo m = new Mongo();
// ou
Mongo m = new Mongo( &quot;localhost&quot; );
// ou
Mongo m = new Mongo( &quot;localhost&quot; , 27017 );

DB db = m.getDB( &quot;meu_banco&quot; );
</pre>
<p>Acredito que a parte mais complicada é transformar um documento no estilo JSON em um objeto <strong>BasicDBObject</strong> que a maioria dos métodos da API recebe. Vamos fazer um exemplo:</p>
<pre class="brush: jscript; title: ; notranslate">
{
	nome : &quot;Rodrigo&quot;,
	sobrenome : &quot;Aramburu&quot;,
	telefone : &quot;1234-5678&quot;,
	endereco : {
				rua : &quot;Rua Fulano&quot;,
				numero : &quot;221B&quot;,
				bairro : &quot;Centro&quot;
			}
}
</pre>
<p>Convertendo este objeto JSON para objeto Java ficaria assim:</p>
<pre class="brush: java; title: ; notranslate">
BasicDBObject pessoa = new BasicDBObject();
pessoa.put(&quot;nome&quot;, &quot;Rodrigo&quot;);
pessoa.put(&quot;sobrenome&quot;, &quot;Aramburu&quot;);
pessoa.put(&quot;telefone&quot;, &quot;1234-5678&quot;);

BasicDBObject end = new BasicDBObject();
end.put(&quot;rua&quot;, &quot;Rua Fulano&quot;);
end.put(&quot;numero&quot;,&quot;221B&quot;);
end.put(&quot;bairro&quot;, &quot;Centro&quot;);

pessoa.put(&quot;endereco&quot;, end);
</pre>
<p>Na linha 1 criamos um objeto <strong>BasicDBObject</strong>, na linhas 2 , 3 e 4 adicionamos os campos nome, sobrenome e telefone e seus valores. O campo endereco é um campo que o valor é um objeto incorporado então antes de adicionarmos ele devemos criar este objeto(linha 6) e incluir seus campos(linhas 7, 8 e 9). Com o objeto endereco podemos inserir no campo endereco do objeto pessoa.</p>
<p>Se você se perguntou e se tivesse vários telefones? Simples!</p>
<pre class="brush: java; title: ; notranslate">
String[] tels = { &quot;1234-5678&quot;,&quot;9898-9898&quot; };
pessoa.put(&quot;telefone&quot;, tels);
</pre>
<p>Com o Objeto criado, inserir no MongoDB é muito simples :</p>
<pre class="brush: java; title: ; notranslate">
DBCollection colecaoPessoas = db.getCollection(&quot;pessoas&quot;);
colecaoPessoas.insert(pessoa);
</pre>
<p>Bom depois de inserir sempre é bom buscar então vamos lá:</p>
<pre class="brush: java; title: ; notranslate">
DBCursor cursor = coll.find();
while( cursor.hasNext() ){
        BasicDBObject pessoa = (BasicDBObject) cursor.next();
        System.out.println( &quot;Nome: &quot;+pessoa.getString(&quot;nome&quot;) );
        System.out.println(&quot;Sobrenome: &quot;+pessoa.getString(&quot;sobrenome&quot;) );
        System.out.println(&quot;Telefone: &quot;+pessoa.getString(&quot;telefone&quot;) );

        BasicDBObject end = (BasicDBObject) pessoa.get(&quot;endereco&quot;);
        System.out.println( &quot;Rua: &quot;+end.getString(&quot;rua&quot;) );
        System.out.println( &quot;Numero: &quot;+end.getString(&quot;numero&quot;) );
        System.out.println( &quot;Bairro: &quot;+end.getString(&quot;bairro&quot;) );
        System.out.println( &quot;======================================&quot; );

}
</pre>
<p>Para fazer uma consulta se utiliza o método <strong>find</strong> que retorna um <strong>DBCursor</strong> que permite iterar sobre o resultado, os métodos mais importantes são <strong>hasNext()</strong> que retorna true se tiver o próximo documento e falso se não tiver mais. E o método <strong>next()</strong> que retorna o próximo <strong>DBObjetc</strong> do qual utilizamos o método <strong>getString(“nome_campo&#8221;)</strong> ou <strong>getInteger(“nome_campo&#8221;)</strong> ,  <strong>getBoolean(“nome_campo&#8221;)</strong>, <strong>getDouble(“nome_campo&#8221;)</strong> para pegar os dados.</p>
<p>E como colocamos alguns critério de busca?</p>
<pre class="brush: java; title: ; notranslate">
BasicDBObject query = new BasicDBObject();
query.put(&quot;telefone&quot;,&quot;9898-9898&quot;);

DBCursor cursor = coll.find(query);
</pre>
<p>Para filtrar basta passar por parâmetro um objeto <strong>BasicDBObject</strong> para o método <strong>find()</strong> e podemos utilizar todos os tipos de filtros, <strong>“$in&#8221;</strong>, <strong>“$lte&#8221;</strong>, <strong>“$gt&#8221;</strong>, <strong>“$or&#8221;</strong>, <strong>“$regex&#8221;</strong>, etc&#8230;</p>
<pre class="brush: java; title: ; notranslate">
BasicDBObject query = new BasicDBObject();

query.put(&quot;idade&quot;, new BasicDBObject().append(&quot;$gt&quot;, 18));

DBCursor cursor = coll.find(query);
</pre>
<p>O interessante no filtro $in é que podemos utilizar uma coleção:</p>
<pre class="brush: java; title: ; notranslate">
BasicDBObject query = new BasicDBObject();
List&lt;Integer&gt; list = new ArrayList&lt;Integer&gt;();
list.add(9);
list.add(10);
query.put(&quot;idade&quot;, new BasicDBObject().append(&quot;$in&quot;, list));
</pre>
<p>Bom agora vamos deletar</p>
<pre class="brush: java; title: ; notranslate">
BasicDBObject obj = new BasicDBObject();
obj.put(&quot;_id&quot;, new ObjectId( &quot;4e827ca3d6340373c65e4e99&quot; )  );
colecaoPessoas.remove(obj);
</pre>
<p>Normalmente eu prefiro deletar pelo _id e o valor deste campo é um objeto do tipo <strong>ObjectId(“id&#8221;)</strong>, criar um objeto <strong>BasicDBObject</strong> para depois  passá-lo de parâmetro para o método <strong>remove()</strong>.</p>
<p>Só falta atualizar </p>
<pre class="brush: java; title: ; notranslate">
BasicDBObject ant = new BasicDBObject();
ant.put(&quot;_id&quot;, new ObjectId( &quot;4e8279f7d63465f846d5cea9&quot; )  );
BasicDBObject novo =  new BasicDBObject();
novo.put(&quot;$set&quot;,  new BasicDBObject().append(&quot;idade&quot;, 16));

colecaoPessoas.update(ant, novo);
</pre>
<p>Bom era isso, até mais e obrigado pelos peixes!!!</p>
<div id="crp_related"><h4>Posts Relacionados:</h4><ul><li><a href="http://www.botecodigital.info/bd-2/nosql-mongodb/" rel="bookmark"><img width="50" height="50" src="http://www.botecodigital.info/wp-content/uploads/2011/09/Icon_MongoDB_by_xkneo.png" class="crp_thumb wp-post-image" alt="NoSQL: MongoDB" title="NoSQL: MongoDB" /></a> <a href="http://www.botecodigital.info/bd-2/nosql-mongodb/" rel="bookmark" class="crp_title">NoSQL: MongoDB</a></li><li><a href="http://www.botecodigital.info/java/lendo-e-escrevendo-xml-em-java-com-jdom/" rel="bookmark"><img width="50" height="50" src="http://www.botecodigital.info/wp-content/uploads/2012/01/java-duke-xml1.png" class="crp_thumb wp-post-image" alt="Lendo e escrevendo XML em Java com JDOM" title="Lendo e escrevendo XML em Java com JDOM" /></a> <a href="http://www.botecodigital.info/java/lendo-e-escrevendo-xml-em-java-com-jdom/" rel="bookmark" class="crp_title">Lendo e escrevendo XML em Java com JDOM</a></li><li><a href="http://www.botecodigital.info/jquery/trocando-dados-utilizando-json/" rel="bookmark"><img width="50" height="50" src="http://www.botecodigital.info/wp-content/uploads/2010/05/jquery.png" class="crp_thumb wp-post-image" alt="Trocando dados utilizando JSON" title="Trocando dados utilizando JSON" /></a> <a href="http://www.botecodigital.info/jquery/trocando-dados-utilizando-json/" rel="bookmark" class="crp_title">Trocando dados utilizando JSON</a></li><li><a href="http://www.botecodigital.info/java/dojo-senac/" rel="bookmark"><img width="50" height="50" src="http://www.botecodigital.info/wp-content/uploads/2011/07/dojo_sp-300x263-150x150.png" class="crp_thumb wp-post-image" alt="Dojo SENAC-Uruguaiana" title="Dojo SENAC-Uruguaiana" /></a> <a href="http://www.botecodigital.info/java/dojo-senac/" rel="bookmark" class="crp_title">Dojo SENAC-Uruguaiana</a></li></ul></div>]]></content:encoded>
			<wfw:commentRss>http://www.botecodigital.info/java/conectando-java-com-mongodb/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Ajustar horário de verão no Debian / Ubuntu</title>
		<link>http://www.botecodigital.info/linux/ajustar-horario-de-verao-no-debian-ubuntu/</link>
		<comments>http://www.botecodigital.info/linux/ajustar-horario-de-verao-no-debian-ubuntu/#comments</comments>
		<pubDate>Sun, 16 Oct 2011 15:14:24 +0000</pubDate>
		<dc:creator>Thiago Finardi</dc:creator>
				<category><![CDATA[Dicas]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[ajustar hora]]></category>
		<category><![CDATA[debian]]></category>
		<category><![CDATA[ntp]]></category>
		<category><![CDATA[ntp.br]]></category>
		<category><![CDATA[ubuntu]]></category>

		<guid isPermaLink="false">http://www.botecodigital.info/?p=1628</guid>
		<description><![CDATA[Manter os dispositivos nas redes e na Internet com a hora certa é muito importante. Isso vale para servidores, roteadores, notebooks e desktops! Muitas aplicações dependem disso para funcionar bem. Incidentes de segurança e até crimes cibernéticos só podem ser investigados se os logs dos dispositivos envolvidos estiverem em sincronismo. Para evitar estes possíveis problemas, utilizamos um repositório central para sincronizar a data e hora em nossos servidores, desktop, etc. Eu recomendo sincronizar com o pool do NTP.BR (Network Time [...]]]></description>
			<content:encoded><![CDATA[<p>Manter os dispositivos nas redes e na Internet com a hora certa é muito importante. Isso vale para servidores, roteadores, notebooks e desktops! Muitas aplicações dependem disso para funcionar bem. Incidentes de segurança e até crimes cibernéticos só podem ser investigados se os logs dos dispositivos envolvidos estiverem em sincronismo.</p>
<p>Para evitar estes possíveis problemas, utilizamos um repositório central para sincronizar a data e hora em nossos servidores, desktop, etc. Eu recomendo sincronizar com o pool do NTP.BR (Network Time Protocol). Sua instalação e configuração é muito simples, vamos aos passos.</p>
<p>Confira a Hora atual e a hora do seu computador:</p>
<div style="text-align:center;"><iframe src="http://monitor.ntp.br/horacerta/banner.php" frameborder="0" scrolling="no" height="60" width="468" marginheight="0px" allowtransparency="true"></iframe></div>
<p>Caso a hora do seu computador esteja errada, siga os passos abaixo e solucione este problema.</p>
<p><strong>Instalando o NTP no Debian</strong></p>
<p>Execute todos os passos logado como root ou utilizando o sudo.</p>
<pre class="brush: plain; title: ; notranslate">apt-get install ntp</pre>
<p>Será instalado o ntp com suas ferramentas de sincronização e monitoramento. Após instalar o ntp, crie o arquivo <in>ntp.drift</in> com o comando:</p>
<pre class="brush: plain; title: ; notranslate">touch /etc/ntp.drift</pre>
<p>Se a hora de seu computador estiver com um erro maior do que 16 minutos, o ntp pode não funcionar. Se for o caso, ajuste a hora manualmente, antes de iniciar o ntpd. Ou então execute o ntpd com os parâmetros abaixo, para um primeiro ajuste, e depois inicie o serviço:</p>
<pre class="brush: plain; title: ; notranslate">ntpd -q -g </pre>
<p>Substitua o conteúdo do arquivo de configuração padrão <in>/etc/ntp.conf</in> pela configuração abaixo.</p>
<pre class="brush: bash; title: ; notranslate">
# &quot;memoria&quot; para o escorregamento de frequencia do micro
# pode ser necessario criar esse arquivo manualmente com
# o comando touch ntp.drift
driftfile /etc/ntp.drift

# estatisticas do ntp que permitem verificar o historico
# de funcionamento e gerar graficos
statsdir /var/log/ntpstats/
statistics loopstats peerstats clockstats
filegen loopstats file loopstats type day enable
filegen peerstats file peerstats type day enable
filegen clockstats file clockstats type day enable

# servidores publicos do projeto ntp.br
server pool.ntp.br iburst
server a.st1.ntp.br iburst
server b.st1.ntp.br iburst
server c.st1.ntp.br iburst
server d.st1.ntp.br iburst
server gps.ntp.br iburst
server a.ntp.br iburst
server b.ntp.br iburst
server c.ntp.br iburst

# outros servidores
# server outro-servidor.dominio.br iburst

# configuracoes de restricao de acesso
restrict default kod notrap nomodify nopeer
restrict -6 default kod notrap nomodify nopeer
</pre>
<p>Após modificar a configuração é preciso reiniciar o ntpd e pronto <img src='http://www.botecodigital.info/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p><strong> Testando o ntp</strong></p>
<p>O ntp traz consigo algumas ferramentas que permitem monitorar seu funcionamento. A mais importante é o ntpq. A seguir são apresentados dois comandos do ntpq que permitem visualizar algumas variáveis importantes do ntp:</p>
<pre class="brush: plain; title: ; notranslate">ntpq -c pe </pre>
<p>Se for obtida uma resposta como:</p>
<pre class="brush: plain; title: ; notranslate">
ntpq -c pe
ntpq: read: Connection refused
</pre>
<p>Significa que o serviço ntp não está funcionando. Uma reposta normal se parece com essa:</p>
<pre class="brush: bash; title: ; notranslate">
  remote        refid         st   t  when  poll  reach  delay   offset  jitter
================================================================================
+a.ntp.br     200.160.7.192    2   u   10    64    337  294.756  35.596   0.521
+b.ntp.br     200.160.7.186    2   u    8    64    377  226.294   2.658   0.229
*c.ntp.br     200.160.7.192    2   u    -    64    377  208.758   4.026   0.424
</pre>
<p>Bom era isso.</p>
<p>Fonte: http://www.ntp.br/</p>
<div id="crp_related"><h4>Posts Relacionados:</h4><ul><li><a href="http://www.botecodigital.info/linux/servidor-dhcp-no-debian-squeeze/" rel="bookmark"><img width="50" height="50" src="http://www.botecodigital.info/wp-content/uploads/2010/06/linux.png" class="crp_thumb wp-post-image" alt="Servidor dhcp no Debian Squeeze" title="Servidor dhcp no Debian Squeeze" /></a> <a href="http://www.botecodigital.info/linux/servidor-dhcp-no-debian-squeeze/" rel="bookmark" class="crp_title">Servidor dhcp no Debian Squeeze</a></li><li><a href="http://www.botecodigital.info/linux/fixando-ip-ao-endereco-mac-nos-hosts-de-uma-lan/" rel="bookmark"><img width="50" height="50" src="http://www.botecodigital.info/wp-content/uploads/2011/11/ip_mac.png" class="crp_thumb wp-post-image" alt="Fixando IP ao endereço MAC nos hosts de uma LAN" title="Fixando IP ao endereço MAC nos hosts de uma LAN" /></a> <a href="http://www.botecodigital.info/linux/fixando-ip-ao-endereco-mac-nos-hosts-de-uma-lan/" rel="bookmark" class="crp_title">Fixando IP ao endereço MAC nos hosts de uma LAN</a></li><li><a href="http://www.botecodigital.info/php/instalando-lamp-no-ubuntu/" rel="bookmark"><img width="50" height="50" src="http://www.botecodigital.info/wp-content/uploads/2011/02/lamp-150x150.png" class="crp_thumb wp-post-image" alt="Instalando LAMP no Ubuntu" title="Instalando LAMP no Ubuntu" /></a> <a href="http://www.botecodigital.info/php/instalando-lamp-no-ubuntu/" rel="bookmark" class="crp_title">Instalando LAMP no Ubuntu</a></li><li><a href="http://www.botecodigital.info/linux/instalando-g210m-no-ubuntu-e-debian/" rel="bookmark"><img width="50" height="50" src="http://www.botecodigital.info/wp-content/uploads/2010/06/linux2.png" class="crp_thumb wp-post-image" alt="Instalando G210m no Ubuntu e Debian" title="Instalando G210m no Ubuntu e Debian" /></a> <a href="http://www.botecodigital.info/linux/instalando-g210m-no-ubuntu-e-debian/" rel="bookmark" class="crp_title">Instalando G210m no Ubuntu e Debian</a></li></ul></div>]]></content:encoded>
			<wfw:commentRss>http://www.botecodigital.info/linux/ajustar-horario-de-verao-no-debian-ubuntu/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>NoSQL: MongoDB</title>
		<link>http://www.botecodigital.info/bd-2/nosql-mongodb/</link>
		<comments>http://www.botecodigital.info/bd-2/nosql-mongodb/#comments</comments>
		<pubDate>Mon, 10 Oct 2011 22:48:34 +0000</pubDate>
		<dc:creator>Rodrigo Aramburu</dc:creator>
				<category><![CDATA[BD]]></category>
		<category><![CDATA[banco de dados]]></category>
		<category><![CDATA[bd]]></category>
		<category><![CDATA[dados]]></category>
		<category><![CDATA[mongodb]]></category>
		<category><![CDATA[nosql]]></category>

		<guid isPermaLink="false">http://www.botecodigital.info/?p=1596</guid>
		<description><![CDATA[Um assunto que tem crescido bastante no último ano é o conceito de banco de dados NoSQL(Not only SQL), que a principio não diz o que é, apenas o que não é . Basicamente o termo é utilizado em oposição ao pensamente da maioria dos desenvolvedores que se você tem que armazenar algum dado isso dever ser feito em um Banco de Dados Relacional(SQL). Bancos de Dados Relacionais já foram a “bala de prata” mas nos dias de hoje os [...]]]></description>
			<content:encoded><![CDATA[<p>Um assunto que tem crescido bastante no último ano é o conceito de banco de dados NoSQL(Not only SQL), que a principio não diz o que é, apenas o que não é <img src='http://www.botecodigital.info/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  . Basicamente o termo é utilizado em oposição ao pensamente da maioria dos desenvolvedores que se você tem que armazenar algum dado isso dever ser feito em um Banco de Dados Relacional(SQL). </p>
<p>Bancos de Dados Relacionais já foram a “bala de prata” mas nos dias de hoje os requisitos de uma performance superior e alta disponibilidade permitiram outros tipos de banco de dados que utilizam outras formas de organização de dados como Wide Column Store/Column Families,Document Store, Key Value/Tuple Store, Eventually Consistent Key Value Store, Graph Databases, Object Databases, Grid Database Solutions, XML Databases. </p>
<p>Como tudo no mundo os bancos de dados NoSQL não fazem mágicas! Eles fornecem melhor performance/disponibilidade/escalabilidade mas para isso fazem alguns sacrifícios nos conceito de ACID.  </p>
<p>Um bom podcast que saiu recentemente muito bom foi do <a href="http://grokpodcast.com/2011/09/15/episodio-45-repensando-os-bancos-de-dados-nosql-parte-1-de-3/">Grok Podcast sobre NoSQL em geral</a></p>
<p>O <a href="http://www.mongodb.org/">MongoDB</a> é um destes bancos que utiliza o modelo de armazenamento <strong>document-oriented  </strong> que armazena documentos no estilo parecido <a href="http://www.json.org/json-pt.html">JSON</a> chamado <a href="http://bsonspec.org/">BSON</a>. Veja um exemplo de JSON.</p>
<pre class="brush: jscript; title: ; notranslate">
{
	nome : &quot;Rodrigo&quot;,
	sobrenome : &quot;Aramburu&quot;,
	telefone : [&quot;1234-5678&quot;,&quot;9898-9898&quot;],
	endereco : {
				rua : &quot;Rua Fulano&quot;,
				numero : &quot;221B&quot;,
				bairro : &quot;Centro&quot;
			}
}
</pre>
<p>Para quem está acostumado a trabalhar com Banco de Dados Relacionais o MongoDB é uma boa quebra de paradigma  já que ele não possui <em>schema</em>, ou seja não é necessário estipular a estrutura dos dados ao criar  o banco, basta adicionar o documento(JSON) contendo os campos desejados, inclusive um documento pode conter outros documentos.</p>
<p>Primeiramente vamos baixar o <a href="http://www.mongodb.org/downloads">MongoDB</a>, basta descompactá-lo e executar o serviço:</p>
<pre class="brush: plain; title: ; notranslate">
$ bin/mongod
</pre>
<p>Por padrão os arquivos de armazenamento serão criados na pasta <strong>/data/db/</strong> se houver necessidade de ser armazenado em outra pasta basta utiliza o parâmetro <strong>-dbpath</strong></p>
<pre class="brush: plain; title: ; notranslate">
$ bin/mongod -dbpath banco
</pre>
<p>Com o serviço iniciado vamos brincar um pouco com o <em>shell</em>, basta iniciá-lo:</p>
<pre class="brush: plain; title: ; notranslate">
$ bin/mongo
</pre>
<p>Ele é um utilitário JavaScript que permite utilizar  variáveis, laços, etc. Para ver os comando disponíveis basta utilizar o comando <strong>help</strong>, também é válido lembrar que o <em>shell</em> já vem com o banco “test&#8221; selecionado, então se você quiser trocar de banco deve utilizar o comando <strong>use nome_do_banco</strong>.Só lembrando para listar todos os banco de dados basta utilizar o comando <strong>show dbs</strong></p>
<p>Os documentos no banco de dados no MongoDB são organizados em coleções(collections), uma coleção não exige que os documento  armazenados nela tenham todos os mesmos campos, por exemplo, pode ser armazenado um documento de  contato e de um carro em uma mesma coleção mesmo que não faça sentido nenhum fazer isso <img src='http://www.botecodigital.info/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  . Para criar uma coleção podemos utilizar o comando abaixo:</p>
<pre class="brush: jscript; title: ; notranslate">
db.createCollection( &quot;nome_da_coleção&quot; )
</pre>
<p>e para vermos todas as coleções de um banco de dados utilizamos o comando:</p>
<pre class="brush: jscript; title: ; notranslate">
db.getCollectionNames()
</pre>
<p>Se você notou para criar e listar nossa coleções utilizamos o objeto <strong>db</strong> que é através dele que iremos manipular nossas coleções e documentos. Para ver todos os comando que podemos utilizar basta executar <strong>db.help()</strong> e <strong>db.nome_da_colecao.help()</strong>. </p>
<p>Agora vamos inserir uma pessoa  na coleção pessoas:</p>
<pre class="brush: jscript; title: ; notranslate">
db.pessoas.save( { nome:&quot;Rodrigo&quot; , sobrenome:&quot;Aramburu&quot; } )
</pre>
<p>e agora vamos inserir uma pessoa com um telefone na mesma coleção:</p>
<pre class="brush: jscript; title: ; notranslate">
db.pessoas.save( { nome:&quot;João&quot; , sobrenome:&quot;Silva&quot; , telefone:&quot;1234-5678&quot; } )
</pre>
<p>ou também podemos inserir uma pessoa com vários telefones fornecendo um array para o campo:</p>
<pre class="brush: jscript; title: ; notranslate">
db.pessoas.save( { nome:&quot;João&quot; , sobrenome:&quot;Silva&quot; , telefone: [ &quot;9898-9898&quot; , &quot;1234-5678&quot; ] } )
</pre>
<p>Agora vamos listar as pessoas </p>
<pre class="brush: jscript; title: ; notranslate">
db.pessoas.find()
</pre>
<p>Onde será listados todos os documento armazenados na coleção</p>
<pre class="brush: jscript; title: ; notranslate">
{ &quot;_id&quot; : ObjectId(&quot;4e7fa9fa6ad8e47661dfff44&quot;), &quot;nome&quot; : &quot;Rodrigo&quot;, &quot;sobrenome&quot; : &quot;Aramburu&quot; }
{ &quot;_id&quot; : ObjectId(&quot;4e7fae3a6ad8e47661dfff45&quot;), &quot;nome&quot; : &quot;João&quot;, &quot;sobrenome&quot; : &quot;Silva&quot;, &quot;telefone&quot; : &quot;1234-5678&quot; }
{ &quot;_id&quot; : ObjectId(&quot;4e7faeac6ad8e47661dfff46&quot;), &quot;nome&quot; : &quot;João&quot;, &quot;sobrenome&quot; : &quot;Silva&quot;, &quot;telefone&quot; : [ &quot;9898-9898&quot;, &quot;1234-5678&quot; ] }
</pre>
<p>Você deve ter notado o campo  “_id&#8221; ele é um identificador único de um documento, se este campo não  for informado quando o documento for salvo ele será gerado automaticamente.</p>
<p>Podemos filtrar a busca fornecendo um objeto, no caso vamos buscar por todas as pessoas com o nome Rodrigo</p>
<pre class="brush: jscript; title: ; notranslate">
db.pessoas.find( { nome:&quot;Rodrigo&quot; } )
</pre>
<p>Como toda busca existem várias opções de filtragem podemos começar com os clássicos:</p>
<pre class="brush: jscript; title: ; notranslate">
db.pessoas.find( { idade : { &quot;$gt&quot; : 18 } } ) //maior que
db.pessoas.find( { idade : { &quot;$lt&quot; : 18 } } )//menor que
db.pessoas.find( { idade : { &quot;$gte&quot; : 18 } } )//maior ou igual que
db.pessoas.find( { idade : { &quot;$lte&quot; : 18 } } )//menor ou igual que
db.pessoas.find( { idade : { &quot;$ne&quot; : 18 } } )//diferent
</pre>
<p>Um pouco diferente do que estamos acostumados. No objeto de pesquisa especificamos o campo  que queremos fazer a comparação e atribuímos a ele um outro objeto que possui como campo a comparação queremos fazer e o valor.</p>
<p>Os operadores <strong>OU</strong> e <strong>E</strong> que são um pouco difícil de entender já que a posição parece mais estranha veja-os:</p>
<pre class="brush: jscript; title: ; notranslate">
db.pessoas.find( { &quot;$or&quot;: [ { nome:&quot;Rodrigo&quot; } , { nome:&quot;João&quot; } ] } )
</pre>
<p>Temos o objeto de pesquisa com o campo <strong>$or</strong> que recebe como valor um array e irá executar o operador OU para cara um destes valores. Também poderá ser utilizado juntamente com qualquer outra comparação como:</p>
<pre class="brush: jscript; title: ; notranslate">
db.pessoas.find( { telefone:&quot;1234-5678&quot; , &quot;$or&quot;: [ { nome:&quot;Rodrigo&quot; } , { nome:&quot;João&quot; } ] } )
</pre>
<p>Neste caso buscará todas as pessoas que tiverem o telefone “1234-5678&#8243; E o nome for “Rodrigo&#8221; OU “João&#8221;.</p>
<p>A operação AND pode ser feita de duas maneiras, se for com dois campos diferentes é bastante simples</p>
<pre class="brush: jscript; title: ; notranslate">
db.pessoas.find( { nome:&quot;Rodrigo&quot; , sobrenome:&quot;Aramburu&quot;} )
</pre>
<p>Mas se tivermos utilizando o mesmo campo é necessário utilizar o formato abaixo<strong>(que apenas funciona na v2.0+)</strong>: </p>
<pre class="brush: jscript; title: ; notranslate">
db.pessoas.find( { &quot;$and&quot;: [ { nome : { &quot;$ne&quot; : &quot;Rodrigo&quot; } } , { nome : { &quot;$ne&quot; : &quot;João&quot; } } ] } )
</pre>
<p>Também no caso de se estar tentando estipular um intervalo de valores também pode ser feio assim:</p>
<pre class="brush: jscript; title: ; notranslate">
db.pessoas.find( { idade : { $gte : 18 , $lte : 29 } } )
</pre>
<p>Também para pesquisa temos o <strong>exists</strong> que buscas apenas os documentos que tem ou não tem um determinado campo (semelhante ao not null que conhecemos)</p>
<pre class="brush: jscript; title: ; notranslate">
db.pessoas.find( { telefone : { $exists : true } } )

//ou

db.pessoas.find( { telefone :{ $exists : false } } )
</pre>
<p>E o <strong>in</strong>  que busca todos os documentos em que o campo for igual a a qualquer um dos valores contidos no array </p>
<pre class="brush: jscript; title: ; notranslate">
db.pessoas.find( { nome : { $in :[ &quot;Rodrigo&quot; , &quot;fernando&quot; ] } } )
</pre>
<p>Bom acho que era isso, mais você pode ver na <a href=”http://www.mongodb.org/display/DOCS/Home”>documentação do MongoDB</a> . Devo publicar mais um post mostrando como conectar Java com MongoDB no dia <strong>randon()</strong>. </p>
<div id="crp_related"><h4>Posts Relacionados:</h4><ul><li><a href="http://www.botecodigital.info/java/conectando-java-com-mongodb/" rel="bookmark"><img width="50" height="50" src="http://www.botecodigital.info/wp-content/uploads/2011/10/java.png" class="crp_thumb wp-post-image" alt="Conectando Java com MongoDB" title="Conectando Java com MongoDB" /></a> <a href="http://www.botecodigital.info/java/conectando-java-com-mongodb/" rel="bookmark" class="crp_title">Conectando Java com MongoDB</a></li><li><a href="http://www.botecodigital.info/jquery/trocando-dados-utilizando-json/" rel="bookmark"><img width="50" height="50" src="http://www.botecodigital.info/wp-content/uploads/2010/05/jquery.png" class="crp_thumb wp-post-image" alt="Trocando dados utilizando JSON" title="Trocando dados utilizando JSON" /></a> <a href="http://www.botecodigital.info/jquery/trocando-dados-utilizando-json/" rel="bookmark" class="crp_title">Trocando dados utilizando JSON</a></li><li><a href="http://www.botecodigital.info/java/lendo-e-escrevendo-xml-em-java-com-jdom/" rel="bookmark"><img width="50" height="50" src="http://www.botecodigital.info/wp-content/uploads/2012/01/java-duke-xml1.png" class="crp_thumb wp-post-image" alt="Lendo e escrevendo XML em Java com JDOM" title="Lendo e escrevendo XML em Java com JDOM" /></a> <a href="http://www.botecodigital.info/java/lendo-e-escrevendo-xml-em-java-com-jdom/" rel="bookmark" class="crp_title">Lendo e escrevendo XML em Java com JDOM</a></li><li><a href="http://www.botecodigital.info/jquery/validando-formularios-com-jquery-plugin-validation/" rel="bookmark"><img width="50" height="50" src="http://www.botecodigital.info/wp-content/uploads/2010/05/jquery.png" class="crp_thumb wp-post-image" alt="Validando formulários com JQuery-Plugin-Validation" title="Validando formulários com JQuery-Plugin-Validation" /></a> <a href="http://www.botecodigital.info/jquery/validando-formularios-com-jquery-plugin-validation/" rel="bookmark" class="crp_title">Validando formulários com JQuery-Plugin-Validation</a></li></ul></div>]]></content:encoded>
			<wfw:commentRss>http://www.botecodigital.info/bd-2/nosql-mongodb/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

