<?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>boa-ventura.net</title>
	<atom:link href="http://boa-ventura.net/feed/" rel="self" type="application/rss+xml" />
	<link>http://boa-ventura.net</link>
	<description></description>
	<lastBuildDate>Tue, 07 Feb 2012 02:16:37 +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>Testes unitários, métodos private e protected</title>
		<link>http://boa-ventura.net/2012/02/06/testes-unitarios-metodos-private-e-protected/</link>
		<comments>http://boa-ventura.net/2012/02/06/testes-unitarios-metodos-private-e-protected/#comments</comments>
		<pubDate>Mon, 06 Feb 2012 12:36:32 +0000</pubDate>
		<dc:creator>bryan</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Teste Unitário]]></category>

		<guid isPermaLink="false">http://boa-ventura.net/?p=260</guid>
		<description><![CDATA[Recentemente me deparei com uma questão e resolvi pesquisar um pouco sobre o assunto. A questão era, eu devo testar meus métodos private/protected em meus testes unitários? O resultado da minha pesquisa me ensinou o seguinte: Não, eu não devo &#8230; <a href="http://boa-ventura.net/2012/02/06/testes-unitarios-metodos-private-e-protected/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Recentemente me deparei com uma questão e resolvi pesquisar um pouco sobre o assunto. A questão era, eu devo testar meus métodos private/protected em meus testes unitários?</p>
<p>O resultado da minha pesquisa me ensinou o seguinte: Não, eu não devo testar esses métodos, pois o que realmente deve ser testado é o comportamento de uma classe. O comportamento de uma classe são os métodos que podem ser acessados pelos usuários, ou seja, os métodos públicos, aqueles que foram assinados na interface. Os métodos private dizem respeito unica e exclusivamente ao funcionamento da própria classe. Podemos até dizer que eles são auxiliares para o comportamento da classe.</p>
<p>O mundo ideal seria chegar ao ponto de sempre criar uma interface antes de implementar  qualquer classe. Ao criar primeiro a interface antes das classes estamos forçando que as classes implementem um comportamento. Não importa a implementação, o que importa é o comportamento esperado. Existem vários artigos bons sobre isso, um deles é este aqui no <a title="Interfaces GUJ" href="http://www.guj.com.br/articles/123" target="_blank">GUJ sobre Interfaces</a>, bem simples e prático.</p>
<p>Após criar a interface já é possível escrever os testes. O teste será escrito com base nos métodos da interface, ignorando qualquer método private que venha a ser criado na classe  implementadora. Os métodos privates certamente serão testados automaticamente ao testar os métodos public. Os testes serão escritos tendo em vista o comportamento esperado das classes que implementarão a interface. Exemplo:</p>
<pre class="brush: java; gutter: true">public interface Veiculo {
      acelerar();
      desacelerar();
      int getVelocidade();
      setVelocidade(int velocidade);
}
public class VeiculoTest {
      Veiculo veiculo;
      public void testeAceleracao() {
           int velocidadeTeste = 5;
           veiculo.setVelocidade(velocidadeTeste);
           veiculo.acelerar();
           Assert.assertTrue(velocidadeTeste &lt; veiculo.getVelocidade());
      }

}</pre>
<p>É um exemplo simples, mas repare que após acelerar o veiculo esperamos que a velocidade tenha aumentado. Sendo assim, qualquer tipo de veiculo que implementar a classe Veiculo não passará no teste se após acelerar a velocidade não aumentar. Este é o comportamento da aceleração. Estamos testando um comportamento.</p>
<p>Após escrever o teste é só implementar a interface. É interessante quanto código é possível produzir sem ao menos ter uma classe concreta.</p>
<p><strong>Dica! </strong>Se você alterar a visibilidade de um método para poder testa-lo, é bem provável que você está fazendo besteira. ;)</p>
<p>Quanto aos métodos protected, eles devem ser testados. Para isso sua classe testadora terá que extends a classe onde estão os métodos protected. Pois podemos dizer que os métodos protected fazem parte do comportamento da classe.</p>
]]></content:encoded>
			<wfw:commentRss>http://boa-ventura.net/2012/02/06/testes-unitarios-metodos-private-e-protected/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Java Regex I</title>
		<link>http://boa-ventura.net/2012/02/03/java-regex-i/</link>
		<comments>http://boa-ventura.net/2012/02/03/java-regex-i/#comments</comments>
		<pubDate>Fri, 03 Feb 2012 13:09:22 +0000</pubDate>
		<dc:creator>bryan</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[regex java split]]></category>

		<guid isPermaLink="false">http://boa-ventura.net/?p=245</guid>
		<description><![CDATA[Aqui vai uma dica simples de como usar regex no Java. Vou explicar seu uso com um exemplo simples. Eu tinha uma string de aproximadamente 5000 caracteres. Precisava quebra-la em X strings de até 999 caracteres. Para isso utilizei a &#8230; <a href="http://boa-ventura.net/2012/02/03/java-regex-i/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Aqui vai uma dica simples de como usar regex no Java. Vou explicar seu uso com um exemplo simples. Eu tinha uma string de aproximadamente 5000 caracteres. Precisava quebra-la em X strings de até 999 caracteres. Para isso utilizei a expressão:</p>
<pre class="brush: text; gutter: true">.{1, 999}</pre>
<p>Simples assim!</p>
<p>Agora como fazer o Java usar esta expressão para quebrar uma string? É simples também, são dois passos.</p>
<ol>
<li>Criar um Pattern com a sua expressão.</li>
<li>Criar um Matcher para aplicar o Pattern a uma string.</li>
</ol>
<div>
<pre class="brush: java; gutter: true">String minhaString = &quot;kwlwefkljfklsdjf...&quot;;
Pattern pattern = Pattern.compile(&quot;.{1, 999}&quot;);
Matcher matcher = pattern.matcher(minhaString);
while(matcher.find()) {
	matcher.group(); // Aqui vem o resultado
}</pre>
</div>
<p>Vale apena dar uma conferida no método java.lang.String.split. Este método espera um delimitador onde ele vai quebrar e retornar um array de Strings. Um exemplo simples.</p>
<pre class="brush: java; gutter: true">String todosAnimais = &quot;gato:cachorro:macaco:vaca&quot;;
String[] animais = animais.split(&quot;:&quot;); //aqui temos nosso array</pre>
<p><strong>Mais Dicas!</strong></p>
<p>Aqui vai um ótimo site de referências sobre regex: <a href="http://www.regular-expressions.info/reference.html">http://www.regular-expressions.info/reference.html</a></p>
<p>Este outro site é para testar suas expreões: <a title="Regex tester" href="http://regexpal.com/">http://regexpal.com</a></p>
]]></content:encoded>
			<wfw:commentRss>http://boa-ventura.net/2012/02/03/java-regex-i/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Apanhando para os bits</title>
		<link>http://boa-ventura.net/2012/01/18/apanhando-para-os-bits/</link>
		<comments>http://boa-ventura.net/2012/01/18/apanhando-para-os-bits/#comments</comments>
		<pubDate>Wed, 18 Jan 2012 15:11:22 +0000</pubDate>
		<dc:creator>bryan</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[bits]]></category>
		<category><![CDATA[byte]]></category>
		<category><![CDATA[converter]]></category>
		<category><![CDATA[hexa]]></category>
		<category><![CDATA[hexadecimal]]></category>
		<category><![CDATA[java]]></category>

		<guid isPermaLink="false">http://boa-ventura.net/?p=221</guid>
		<description><![CDATA[Por dois dias eu apanhei para conseguir escrever uma string hexadecimal em um socket. A string se parecia com isso: String string = &#34;08A235A410&#34;; Repare que esta string representa um hexadecimal, sendo que cada par de caracteres representa um byte hexadecimal. &#8230; <a href="http://boa-ventura.net/2012/01/18/apanhando-para-os-bits/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Por dois dias eu apanhei para conseguir escrever uma string hexadecimal em um socket. A string se parecia com isso:</p>
<pre class="brush: java; gutter: true">String string = &quot;08A235A410&quot;;</pre>
<p>Repare que esta string representa um hexadecimal, sendo que cada par de caracteres representa um byte hexadecimal. Por exemplo, os dois primeiros caracteres da string formam o hexadecimal 0&#215;08, os próximos 0xA2 e assim por diante.</p>
<p>Para que eu pudesse escrever isso no socket eu precisava converter a string para um array de byte e cada byte seria um hexadecimal. Como fazer essa conversão?</p>
<pre class="brush: java; gutter: true">public byte[] hexString2ByteArray(String str) {
	    int len = str.length();
	    byte[] bytes = new byte[len / 2];
	    for(int i = 0; i &lt; len; i += 2) {
	        bytes[i / 2] = (byte) ((Character.digit(str.charAt(i), 16) &lt;&lt; 4) + Character.digit(str.charAt(i+1), 16));
	    }
	    return bytes;
	}</pre>
<p>Este método é bem simples. Ele lê de dois em dois caracteres, converte cada caractere de base 16 para decimal, faz um deslocamento de 4 bits para a esquerda do primeiro caractere, depois soma o resultado do primeiro e do segundo caractere e por fim faz um cast para byte.</p>
<p>Desse modo eu consegui converter uma string em um array de bytes e foi só escrever no socket.</p>
<p><strong>Nota!</strong> Um hexadecimal usa 8 bits para representar seu valor, que em decimal seria de 0 a 255. Um byte também precisa de 8 bits para representar seu valor, mas em Java um byte é representado de -128 a 127. A diferença entre eles é que um é signed e o outro é unsigned. Ou seja, um usa sinal (positivo/negativo) e o outro não. Tipos que são signed usam o primeiro dos 8 bits para representar o sinal, já os unsigned usam todos os bits para representar o seu valor. O que torna possível fazer a conversão é que tanto o byte quanto o hexadecimal usam 8 bits e por isso tem um mesmo range. De -128 a 127 ou de 0 a 255 da no mesmo, ambos tem a mesma capacidade.</p>
<p>&nbsp;</p>
<p>Fontes:</p>
<p><a href="http://stackoverflow.com/questions/140131/convert-a-string-representation-of-a-hex-dump-to-a-byte-array-using-java">http://stackoverflow.com/questions/140131/convert-a-string-representation-of-a-hex-dump-to-a-byte-array-using-java</a></p>
]]></content:encoded>
			<wfw:commentRss>http://boa-ventura.net/2012/01/18/apanhando-para-os-bits/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Cálculo de base 16 (conversão hexadecimal decimal)</title>
		<link>http://boa-ventura.net/2012/01/17/calculo-de-base-16-conversao-hexadecimal-decimal/</link>
		<comments>http://boa-ventura.net/2012/01/17/calculo-de-base-16-conversao-hexadecimal-decimal/#comments</comments>
		<pubDate>Tue, 17 Jan 2012 14:32:22 +0000</pubDate>
		<dc:creator>bryan</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[base 16]]></category>
		<category><![CDATA[base16]]></category>
		<category><![CDATA[deslocamento de bits]]></category>
		<category><![CDATA[hexadecimal]]></category>
		<category><![CDATA[java]]></category>

		<guid isPermaLink="false">http://boa-ventura.net/?p=236</guid>
		<description><![CDATA[&#160; No artigo anterior expliquei somente como converter de decimal para hexadecimal, agora quero explicar a conversão inversa, de hexadecimal para decimal. Só para relembrar a tabela, ai vai ela novamente. Decimal Hexa 0 0 1 1 2 2 3 &#8230; <a href="http://boa-ventura.net/2012/01/17/calculo-de-base-16-conversao-hexadecimal-decimal/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>&nbsp;</p>
<p>No artigo anterior expliquei somente como converter de decimal para hexadecimal, agora quero explicar a conversão inversa, de hexadecimal para decimal.</p>
<p>Só para relembrar a tabela, ai vai ela novamente.</p>
<table style="width: 240px;">
<thead>
<tr>
<td>Decimal</td>
<td>Hexa</td>
</tr>
</thead>
<tbody>
<tr>
<td>0</td>
<td>0</td>
</tr>
<tr>
<td>1</td>
<td>1</td>
</tr>
<tr>
<td>2</td>
<td>2</td>
</tr>
<tr>
<td>3</td>
<td>3</td>
</tr>
<tr>
<td>4</td>
<td>4</td>
</tr>
<tr>
<td>5</td>
<td>5</td>
</tr>
<tr>
<td>6</td>
<td>6</td>
</tr>
<tr>
<td>7</td>
<td>7</td>
</tr>
<tr>
<td>8</td>
<td>8</td>
</tr>
<tr>
<td>9</td>
<td>9</td>
</tr>
<tr>
<td>10</td>
<td>A</td>
</tr>
<tr>
<td>11</td>
<td>B</td>
</tr>
<tr>
<td>12</td>
<td>C</td>
</tr>
<tr>
<td>13</td>
<td>D</td>
</tr>
<tr>
<td>14</td>
<td>E</td>
</tr>
<tr>
<td>15</td>
<td>F</td>
</tr>
</tbody>
</table>
<p>Para realizar este cálculo fazemos os seguintes passos.</p>
<ol>
<li>Converte cada dígito para decimal usando a tabela.</li>
<li>Multiplique cada dígito por 16 ^ n, sendo n a ordem do dígito. O mais a direita é zero.</li>
<li>Some os resultados.</li>
</ol>
<p>Vamos converter A2 para decimal.</p>
<pre>A = 10 (olhe a tabela)
2 = 2
(10 * (16 ^ 1)) + (2 * (16 ^ 0))
(10 * 16) + (2 * 1)
160 + 2
A2 = 162</pre>
<p>Mais um exemplo, agora com um hexadecimal um pouco maior. Vamos converter 4B1.</p>
<pre>4 = 4
B = 11
1 = 1
(4 * (16 ^ 2)) + (11 * (16 ^ 1)) + (1 * (16 ^ 0))
(4 * 256) + (11 * 16) + (1 * 1)
1024 + 176 + 1
4B1 = 1201</pre>
<p>Acho que a conversão ficou entendida. Só vou acrescentar uma questão interessante aqui. A questão é que podemos utilizar deslocamento de bits para fazer os cálculos de potência. Usando por base o ultimo exemplo, podemos fazer o seguite.</p>
<pre>4 = 4
B = 11
1 = 1
(4 &lt;&lt; 8) + (11 &lt;&lt; 4) + (1)
1024 + 176 + 1
4B1 = 1201</pre>
<p>Caso não tenha entendido o exemplo anterior use multiplicação e potência, caso faça questão de entender o exemplo anterior pesquise deslocamento de bits e números binários. Se eu escrever algo sobre isso vou colocar aqui o link.</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://boa-ventura.net/2012/01/17/calculo-de-base-16-conversao-hexadecimal-decimal/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Calculo de base 16 (conversão decimal hexadecimal)</title>
		<link>http://boa-ventura.net/2012/01/16/calculo-de-base-16-conversao-decimal-hexadecimal/</link>
		<comments>http://boa-ventura.net/2012/01/16/calculo-de-base-16-conversao-decimal-hexadecimal/#comments</comments>
		<pubDate>Mon, 16 Jan 2012 13:58:08 +0000</pubDate>
		<dc:creator>bryan</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[base 16]]></category>
		<category><![CDATA[base16]]></category>
		<category><![CDATA[hexa]]></category>
		<category><![CDATA[hexadecimal]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[radix]]></category>

		<guid isPermaLink="false">http://boa-ventura.net/?p=227</guid>
		<description><![CDATA[Para fazer a conversão de um decimal para hexadecimal é preciso relembrar a tabela de valores dos hexadecimais. Decimal Hexa 0 0 1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 &#8230; <a href="http://boa-ventura.net/2012/01/16/calculo-de-base-16-conversao-decimal-hexadecimal/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Para fazer a conversão de um decimal para hexadecimal é preciso relembrar a tabela de valores dos hexadecimais.</p>
<table style="width: 240px;">
<thead>
<tr>
<td>Decimal</td>
<td>Hexa</td>
</tr>
</thead>
<tbody>
<tr>
<td>0</td>
<td>0</td>
</tr>
<tr>
<td>1</td>
<td>1</td>
</tr>
<tr>
<td>2</td>
<td>2</td>
</tr>
<tr>
<td>3</td>
<td>3</td>
</tr>
<tr>
<td>4</td>
<td>4</td>
</tr>
<tr>
<td>5</td>
<td>5</td>
</tr>
<tr>
<td>6</td>
<td>6</td>
</tr>
<tr>
<td>7</td>
<td>7</td>
</tr>
<tr>
<td>8</td>
<td>8</td>
</tr>
<tr>
<td>9</td>
<td>9</td>
</tr>
<tr>
<td>10</td>
<td>A</td>
</tr>
<tr>
<td>11</td>
<td>B</td>
</tr>
<tr>
<td>12</td>
<td>C</td>
</tr>
<tr>
<td>13</td>
<td>D</td>
</tr>
<tr>
<td>14</td>
<td>E</td>
</tr>
<tr>
<td>15</td>
<td>F</td>
</tr>
</tbody>
</table>
<p>Depois de lembrar isso vamos pegar um decimal qualquer e tentar converte-lo para hexadecimal. Para isso temos que calcular a base 16 do decimal. Vamos então descobrir o hexadcimal do decimal 30.</p>
<pre>30 / 16 = 1
agora pega o resto e olha na tabela qual a representação em hexa  (14 = E)
30 = 1E</pre>
<p>Simples! Divide o seu numero por 16 e o resto é só converter na tabela hexa. Mais um exemplo pra ficar mais claro.</p>
<pre>100 / 16 = 6
resta 4 que convertendo (4 = 4)
100 = 64</pre>
<p>Alguns métodos no java fazem essa conversão. Sempre que o método pedir um parâmetro chamado radix, ele fará este cálculo. Por exemplo, Integer.toString, Byte.parseByte, Integer.valueOf e vários outros.</p>
<p>Aqui vai uma implementação simples de um método para fazer esse cálculo, só para deixar mais claro caso não tenha ficado.</p>
<pre class="brush: actionscript3; gutter: true">	private String decimalToBase16(int decimal) {
		String baseDigits = &quot;0123456789ABCDEF&quot;;
        String tempVal = decimal == 0 ? &quot;0&quot; : &quot;&quot;;
        int mod = 0;

        while(decimal != 0) {
            mod = decimal % 16;
            tempVal = baseDigits.substring(mod, mod + 1) + tempVal;
            decimal = decimal / 16;
        }  

        return tempVal;
    }</pre>
]]></content:encoded>
			<wfw:commentRss>http://boa-ventura.net/2012/01/16/calculo-de-base-16-conversao-decimal-hexadecimal/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Listar tabelas do banco de dados</title>
		<link>http://boa-ventura.net/2011/02/04/listar-tabelas-do-banco-de-dados/</link>
		<comments>http://boa-ventura.net/2011/02/04/listar-tabelas-do-banco-de-dados/#comments</comments>
		<pubDate>Fri, 04 Feb 2011 17:00:19 +0000</pubDate>
		<dc:creator>bryan</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[banco de dados]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[metadata]]></category>

		<guid isPermaLink="false">http://boa-ventura.net/?p=213</guid>
		<description><![CDATA[Lista de Tabelas (Banco de dados) No sybase tem um comando chamado sp_help que retorna as tabelas de um schema entre outras informações. Estava tentando rodar este comando com Java mas tive uma feliz lembrança de que existe uma API &#8230; <a href="http://boa-ventura.net/2011/02/04/listar-tabelas-do-banco-de-dados/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<h1>Lista de Tabelas (Banco de dados)</h1>
<p>No sybase tem um comando chamado sp_help que retorna as tabelas de um schema entre outras informações. Estava tentando rodar este comando com Java mas tive uma feliz lembrança de que existe uma API do Java com informações do banco (MetaData). A primeira vez que tive contato com essa API foi na faculdade, por isso disse “feliz lembrança”, pois fiquei feliz ao saber que a faculdade serviu para alguma coisa.<br />
Então ai vai o código para retornar essa lista de tabelas. Vale apena estudar a API.</p>
<pre class="brush: java; gutter: true">import java.sql.*;
public class ListaTabelas {
 public static void main(String [] args) {
 Connection con = null;
 try {
 Class.forName(&quot;sun.jdbc.odbc.JdbcOdbcDriver&quot;); //O banco que vai usar
 con = DriverManager.getConnection(&quot;jdbc:odbc:HY_FLAT&quot;);
DatabaseMetaData meta = con.getMetaData();
 ResultSet res = meta.getTables(null, null, null, new String[] {&quot;TABLE&quot;});
 System.out.println(&quot;List of tables: &quot;);
 while (res.next()) {
 System.out.println(
 &quot; &quot;+res.getString(&quot;TABLE_CAT&quot;)
 + &quot;, &quot;+res.getString(&quot;TABLE_SCHEM&quot;)
 + &quot;, &quot;+res.getString(&quot;TABLE_NAME&quot;)
 + &quot;, &quot;+res.getString(&quot;TABLE_TYPE&quot;)
 + &quot;, &quot;+res.getString(&quot;REMARKS&quot;));
 }
 res.close();
 con.close();
 } catch (Exception e) {
 System.err.println(&quot;Exception: &quot;+e.getMessage());
 }
 }
}</pre>
]]></content:encoded>
			<wfw:commentRss>http://boa-ventura.net/2011/02/04/listar-tabelas-do-banco-de-dados/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Ocultando pacotes vazios no Eclipse</title>
		<link>http://boa-ventura.net/2011/01/08/ocultando-pacotes-vazios-no-eclipse/</link>
		<comments>http://boa-ventura.net/2011/01/08/ocultando-pacotes-vazios-no-eclipse/#comments</comments>
		<pubDate>Sat, 08 Jan 2011 14:30:13 +0000</pubDate>
		<dc:creator>bryan</dc:creator>
				<category><![CDATA[Eclipse]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Problemas]]></category>
		<category><![CDATA[eclipse]]></category>
		<category><![CDATA[java]]></category>

		<guid isPermaLink="false">http://boa-ventura.net/?p=170</guid>
		<description><![CDATA[Meu eclipse de uma hora pra outra começou a mostrar os pacotes vazios no Project Explorer. Não que seja um problema, mas eu não estava acostumado com essa visualização. Para que ele esconda os pacotes vazios é só ir no &#8230; <a href="http://boa-ventura.net/2011/01/08/ocultando-pacotes-vazios-no-eclipse/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Meu eclipse de uma hora pra outra começou a mostrar os pacotes vazios no Project Explorer. Não que seja um problema, mas eu não estava acostumado com essa visualização. Para que ele esconda os pacotes vazios é só ir no Package Explorer &gt; View Menu <a href="http://boa-ventura.net/wp-content/uploads/2011/06/icon_menu.png"><img class="alignnone size-full wp-image-172" title="icon_menu" src="http://boa-ventura.net/wp-content/uploads/2011/06/icon_menu.png" alt="" width="18" height="16" /></a>&gt; Customize View. Na aba Filters é só marcar Empty Packages e Empty parent Packages.</p>
]]></content:encoded>
			<wfw:commentRss>http://boa-ventura.net/2011/01/08/ocultando-pacotes-vazios-no-eclipse/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Eclipse project explorer e editor link</title>
		<link>http://boa-ventura.net/2011/01/05/eclipse-project-explorer-e-editor-link/</link>
		<comments>http://boa-ventura.net/2011/01/05/eclipse-project-explorer-e-editor-link/#comments</comments>
		<pubDate>Wed, 05 Jan 2011 10:27:41 +0000</pubDate>
		<dc:creator>bryan</dc:creator>
				<category><![CDATA[Eclipse]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Problemas]]></category>
		<category><![CDATA[eclipse]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[packages]]></category>

		<guid isPermaLink="false">http://boa-ventura.net/?p=191</guid>
		<description><![CDATA[Esses dias o meu eclipse perdeu o vinculo entre o Project Explorer e o editor ativo, ou seja, sempre que eu selecionava um arquivo no editor meu Project Explorer automaticamente buscava o arquivo sendo editado e ficava com ele selecionado. Para &#8230; <a href="http://boa-ventura.net/2011/01/05/eclipse-project-explorer-e-editor-link/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Esses dias o meu eclipse perdeu o vinculo entre o Project Explorer e o editor ativo, ou seja, sempre que eu selecionava um arquivo no editor meu Project Explorer automaticamente buscava o arquivo sendo editado e ficava com ele selecionado. Para ativar esta funcionalidade novamente é só ir no Package Explorer &gt; Link with Editor <a href="http://boa-ventura.net/wp-content/uploads/2011/06/Eclipse-Crucible-Review-LinkEditorIcon.png"><img title="Eclipse-Crucible-Review-LinkEditorIcon" src="http://boa-ventura.net/wp-content/uploads/2011/06/Eclipse-Crucible-Review-LinkEditorIcon.png" alt="" width="15" height="16" /></a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://boa-ventura.net/2011/01/05/eclipse-project-explorer-e-editor-link/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Java Generics (newbie)</title>
		<link>http://boa-ventura.net/2010/10/04/java-generics-newbie/</link>
		<comments>http://boa-ventura.net/2010/10/04/java-generics-newbie/#comments</comments>
		<pubDate>Mon, 04 Oct 2010 10:17:39 +0000</pubDate>
		<dc:creator>bryan</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[generics]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[newbie]]></category>

		<guid isPermaLink="false">http://boa-ventura.net/?p=198</guid>
		<description><![CDATA[Generics O que são os generics? Este é um conceito novo para quem sai do PHP e vai para o Java. No Java tudo deve ser previamente declarado, por exemplo, o tipo de retorno de um método ou o tipo &#8230; <a href="http://boa-ventura.net/2010/10/04/java-generics-newbie/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<h1>Generics</h1>
<p>O que são os generics? Este é um conceito novo para quem sai do PHP e vai para o Java. No Java tudo deve ser previamente declarado, por exemplo, o tipo de retorno de um método ou o tipo de uma variável (coisa que não se faz com PHP).</p>
<h1>Classes Genéricas</h1>
<p>Precisei aprender sobre generics na primeira vez que precisei usar um “array” (Collection). Este é um exemplo de um array simples:</p>
<pre class="brush: java; gutter: true">java.util.List lista = new java.util.ArrayList(); //Cria uma lista
 lista.add(&quot;Valor do primeiro&quot;); //Adiciona uma string na lista
 String x = (String) lista.get(0); //Pega o valor do primeiro indice da lista
 System.out.println(x); //Mostra o valor armazenado em x</pre>
<p>Uma lista (objeto do tipo List), pode receber qualquer objeto (Object). Sendo assim, ao acessar um dos indices da lista deve se fazer um cast (linha 3 do exemplo) para o tipo originalmente inserido. Isso acontece pois a lista somente pode garantir que o que está retornando é um objeto (Object) mas não um objeto String.<br />
A idéia dos generics seria que por exemplo, uma lista possa armazenar somente um tipo de dados. Para fazer isso se usa os simbolos “&lt;&gt;”. O mesmo exemplo acima só que usando generics:</p>
<pre class="brush: java; gutter: true">java.util.List&lt;String&gt; lista = new java.util.ArrayList&lt;String&gt;(); //Cria uma lista
 lista.add(&quot;Valor do primeiro&quot;); //Adiciona uma string na lista
 String x = lista.get(0); //Pega o valor do primeiro indice da lista
 System.out.println(x); //Mostra o valor armazenado em x</pre>
<p>Agora a lista não é simplesmente uma lista arbitraria de qualquer tipo, mas é uma lista especifica de strings. Esta lista não vai aceitar qualquer outro tipo de objetos que não sejam strings.</p>
]]></content:encoded>
			<wfw:commentRss>http://boa-ventura.net/2010/10/04/java-generics-newbie/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PHP &#8211; Curl &amp; Captchas II</title>
		<link>http://boa-ventura.net/2009/03/06/php-curl-captchas-ii/</link>
		<comments>http://boa-ventura.net/2009/03/06/php-curl-captchas-ii/#comments</comments>
		<pubDate>Fri, 06 Mar 2009 13:41:56 +0000</pubDate>
		<dc:creator>bryan</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[burlar+captcha]]></category>
		<category><![CDATA[curl+captcha]]></category>
		<category><![CDATA[php+captcha]]></category>
		<category><![CDATA[php+curl]]></category>
		<category><![CDATA[quebrar+captcha]]></category>

		<guid isPermaLink="false">http://blog.boa-ventura.net/?p=127</guid>
		<description><![CDATA[        De volta com o assunto de manipular os captchas com o Curl. Lembram que no primeiro POST eu havia falado que se não fosse possivel burlar o captcha ao menos poderiamos copia-lo e valida-lo em nosso sistema? Então mostrei &#8230; <a href="http://boa-ventura.net/2009/03/06/php-curl-captchas-ii/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>        De volta com o assunto de manipular os captchas com o Curl. Lembram que no primeiro POST eu havia falado que se não fosse possivel burlar o captcha ao menos poderiamos copia-lo e valida-lo em nosso sistema? Então mostrei como era possivel copia-lo e valida-lo em nosso sistema, e agora quero mostrar como é possivel burlar o captcha.<br />
        Certamente isso não é possivel em 100% dos casos, talvez em 20 ou 30%. Tudo depende de como o sistema para geração de captcha funciona.<br />
O exemplo que usaremos hoje é no site da Secretaria da Fazenda do Estado do Rio Grande do Sul, veja o link <a href="http://www.sefaz.rs.gov.br/asp/SEF_root/inf/sintegra_entrada.asp">aqui</a>. O governo do estado dispoe de uma ficha de registro de contribuintes (pessoa juridica) que é consultada por CNPJ ou inscrição estadual.<br />
        Agora que ja sabemos para que serve e o que faz, vamos ao codigo. Observe bem o que o sistema do governo faz:<br />
        <strong>Tela 1</strong> &#8211; Voce deve digitar o CNPJ / IE para acessar a ficha.<br />
        <strong>Tela 2</strong> &#8211; Voce deve digitar os caracteres do captcha.<br />
        <strong>Tela 3</strong> &#8211; Mostra a ficha do contribuinte do CNPJ / IE em questão.</p>
<p>        Legal! Mas vamos nos aprofundar um pouquinho mais e ver quem são os responsaveis que isso tudo aconteça. Vamos por partes!</p>
<p><strong>Tela 1.</strong><br />
- Vejam com atenção os inputs a serem enviados via post no form:<br />
        SEQ = 1<br />
        LOCAL = SINTEGRA<br />
        cgcmf = (cnpj digitado pelo usuario)<br />
        cgcte = (ie digitado pelo usuario)<br />
- Essas informações são enviadas via post para &#8220;http://sintegra.sefaz.rs.gov.br/sef_root/inf/SEF_entrada_sintegra_completa_1.asp?Menu=Nao&#8221;.</p>
<p><strong>Tela 2.<br />
</strong>- É gerada pelo link acima.<br />
- Veja que interessante a propriedade scr da imagem, &#8220;../../includeNovo/GeraImagemVerificacao.asp&#8221;, não é uma imagem.<br />
- Envia via post as seguintes variaveis:<br />
MsgUsuario = (os caracteres do captcha digitado pelo usuatio)<br />
btOK= Avançar<br />
- Essas informações são enviadas via post para &#8220;http://sintegra.sefaz.rs.gov.br/sef_root/inf/SEF_entrada_sintegra_completa_3.asp?origem=&amp;amb=&amp;consulta=Direta&amp;Menu=Nao&amp;dtDataConsulta=&#8221;.</p>
<p><strong>Tela 3.</strong><br />
- É gerada pelo link acima.<br />
- Não tem nemhuma ação.</p>
<p>Dica<br />
        Quando vamos usar CURL em uma pagina que vai fazer autenticação de qualquer especie, sempre armazene os cookies de seção usando CURLOPT_COOKIEJAR. Nunca sabemos quando o sistema vai precisar ler ou gravar esse tipo de cookies.</p>
<p>        Agora que já está tudo explicado vamos aos codigos. Vai ser mais facil explicar como fazer os macetes com o codigo ja na tela.<br />
Vamos fazer tudo em um mesmo arquivo todo o codigo junto. Salve-o como &#8220;curl.php&#8221;.<br />
        Lembram da função &#8220;recebe_imagem&#8221; que usamos no post anterior? Vamos usa-la novamente. Aí vai a função.</p>
<pre lang="php" class="1">
        function recebe_imagem($url, $arquivo, $cookief="", $cookiej="") {
$ch = curl_init ($url);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
                if(!empty($cookief)) {
        curl_setopt($ch, CURLOPT_COOKIEFILE, $cookief);
        }
                if(!empty($cookiej)) {
        curl_setopt($ch, CURLOPT_COOKIEJAR, $cookiej);
        }
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_BINARYTRANSFER,1);
$data=curl_exec($ch);
curl_close ($ch);
$fp = fopen($arquivo,'w');
fwrite($fp, $data);
fclose($fp);
return $arquivo;
}
</pre>
<p>       Vamos usar tambem uma outra função simples de apoio.</p>
<pre lang="php" class="20">
        function between($beg, $end, $str, $i=0, $p="S") {
$a = explode($beg, $str, 2);
$b = explode($end, $a[1]);
$return = $p == "S" ? $beg . $b[$i] . $end : $b[$i];
return $return;
}
</pre>
<p>20-25. Entenderam? ela serve simplesmente para pegar o conteudo de uma string entre dois delimitadores. Voces vão ver.</p>
<p>       Agora vamos criar uma outra função que só mostra o formulario.</p>
<pre lang="php" class="26">
        function ConsultaSintegraForm()	{
echo "
<form method='POST' action='curl2.php'>";
echo "Digite o CNPJ";
echo "";
echo "
<input type='text' name='cnpj'/>";
echo "";
echo "OU digite a inscrição estadual";
echo "";
echo "
<input type='text' name='ie'/>";
echo "";
echo "";
echo "
<input type='submit'/>";
echo "</form>

";
echo "";
echo "Repare que não tem o captcha para digitar! Vamos pular ele? Será!?";
}
</pre>
<p>26-41. Sem explicação para isso.</p>
<p>      Lembram que na explicação &#8220;Tela1&#8243; no começo do post vimos que eram necessario 4 inputs? SEQ, LOCAL, cgcmf e cgcte? Mas os dois primeiros nunca mudam, então neste formulario só queremos o conteudo dinamico.</p>
<p>       Agora vamos ao monstro! Fiz uma função que faz a consulta. Vou coloca-la por partes com fins de didaticos.</p>
<pre lang="php" class="42">
        function ConsultaSintegra($cnpj, $ie)	{
$post="SEQ=1&#038;LOCAL=SINTEGRA&#038;cgcmf=$cnpj&#038;cgcte=$ie";
$ch = curl_init("http://sintegra.sefaz.rs.gov.br/sef_root/inf/SEF_entrada_sintegra_completa_1.asp?Menu=Nao");
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $post);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_COOKIEJAR, "sintegra.txt");
$output = curl_exec($ch);
curl_close($ch);
</pre>
<p>42. A função tem dois parametros $cnpj e $ie.<br />
43. Criamos uma variavel com os valores dos 4 inputs necessarios.<br />
44. Inicia uma seção CURL para a url passada por parametro.<br />
45. Avisa ao CURL que vamos enviar dados via post.<br />
46. Diz para o CURL onde estão os dados que vamos enviar.<br />
47. Pede para o CURL salvar o retorno em uma variavel.<br />
48. Avisa ao CURL que pode seguir qualquer redirecionamento.<br />
49. Salva os cookies de seção no arquivo &#8220;sintegra.txt&#8221;.<br />
50. Executa a seção CURL e guarda o retorno em $output.<br />
51. Finaliza a seção CURL.</p>
<p>       Até aqui beleza. Ja tinhamos visto praticamente a mesma coisa no post anterior. Agora o negócio esquenta!</p>
<pre lang="php" class="52">
$ch = curl_init("http://sintegra.sefaz.rs.gov.br/Include/GeraImagemVerificacao.asp");curl_setopt($ch, CURLOPT_COOKIEFILE, "sintegra.txt");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$senha=curl_exec($ch);
curl_close ($ch);
</pre>
<p>52. Inicia uma seção CURL para a url passada por parametro.<br />
53. Le o cookie de seção que gravamos anteriormente (linha 50).<br />
54. Pede para o CURL salvar o retorno em uma variavel.<br />
55. Encerra a seção CURL.</p>
<p>       Por que fizemos isso? O script &#8220;GeraImagemVerificacao.asp&#8221; só serve para uma coisa, para verificar se os cookies de seção estão gravados com os devidos valores e provavelmente deve conferir se existe a variavel &#8220;cgcmf&#8221; ou &#8220;cgcte&#8221; que enviamos via post anteriormente. Após ele fazer essas verificações o &#8220;GeraImagemVerificacao.asp&#8221; redireciona para outro script. Mas observe que nós não pedimos para o CURL seguir os redirecionamentos com a opção &#8220;CURLOPT_FOLLOWLOCATION&#8221;. O redirecionamento é para o script &#8220;webcod.cgi&#8221;, veja um exemplo da url completa do redirecionamento: &#8220;http://www.sefaz.rs.gov.br/cgi-bin/webcod.cgi?figura=876r&#8221;. O que tem de interessante aí? O codigo do captcha! huahauahuahuahua! Agora então temos em uma variavel o codigo do captcha, só temos que cortar algumas partes para pega-la.</p>
<p>Observação:<br />
       O script &#8220;GeraImagemVerificacao.asp&#8221; é responsavel pelas verificações dos cookies de seção. Se tudo estiver ok ele vai gravar um outro cookie de seção com os valores do captcha.<br />
       O script &#8220;webcod.cgi&#8221; simplesmente é responsavel por gerar a imagem do captcha com os valores que ele recebe por parametro em &#8220;figura&#8221;.</p>
<pre lang="php" class="56">
$senha=explode("?", $senha);
$senha=explode('"', $senha[1]);
$senha=explode('=', $senha[0]);
$senha=$senha[1];
</pre>
<p>56-59. Cortamos tudo até ficarmos só com o captcha.</p>
<p>       Agora vamos acessar o script &#8220;GeraImagemVerificacao.asp&#8221; a fim de que ele salve os cookies de seção. Vamos usar para isso a função &#8220;recebe_imagem&#8221;.</p>
<pre lang="php" class="60">
recebe_imagem("http://sintegra.sefaz.rs.gov.br/Include/GeraImagemVerificacao.asp",
                      "ImgSintegra.png",
                      "sintegra.txt",
                      "Imgsintegra.txt");
</pre>
<p>       Certo? E agora? Agora ja temos a faca e o queijo na mão, é só cortar e mandar ver. Então finalmente o fim da função.</p>
<pre lang="php" class="64">
$post="MsgUsuario=".$senha."&#038;btOK= Avançar ";
$ch = curl_init("http://sintegra.sefaz.rs.gov.br/sef_root/inf/SEF_entrada_sintegra_completa_3.asp?origem=&#038;amb=&#038;consulta=Direta&#038;Menu=Nao&#038;dtDataConsulta=");
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $post);
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_COOKIEFILE, "Imgsintegra.txt");
curl_setopt($ch, CURLOPT_COOKIEJAR, "sintegra.txt");
$output = curl_exec($ch);
curl_close ($ch);
echo $output;
}
</pre>
<p>64. Criamos uma variavel com o valor do captcha e mais uma variavel.<br />
65. Inicia uma seção CURL para a url passada por parametro.<br />
66. Avisa ao CURL que vamos enviar dados via post.<br />
67. Diz para o CURL onde estão os dados que vamos enviar.<br />
68. Pede para o CURL salvar o retorno em uma variavel.<br />
69. Avisa ao CURL que pode seguir qualquer redirecionamento.<br />
70. Le o cookie de seção salvo pela função &#8220;recebe_imagem&#8221;.<br />
71. Salva o cookie de seção no arquivo &#8220;sintegra.txt&#8221;.<br />
72. Executa a seção CURL e guarda o retorno em $output.<br />
73. Finaliza a seção CURL.<br />
74. Mostra o resultado.<br />
75. Termina a função.</p>
<p>     É para dar certo! Vamos tornar o script usavel.</p>
<pre lang="php" class="76">
       if(isset($_POST['cnpj']) OR isset($_POST['ie'])) {
ConsultaSintegra($_POST['cnpj'], $_POST['ie']);
}
       else {
ConsultaSintegraForm();
}
</pre>
<p>       Pronto, salve tudo entre as tags do php e acesse-o, use este cnpj para testar 05385071000173. Deu certo? Uhuuuu! legal né?! </p>
<p>       até a próxima,</p>
]]></content:encoded>
			<wfw:commentRss>http://boa-ventura.net/2009/03/06/php-curl-captchas-ii/feed/</wfw:commentRss>
		<slash:comments>25</slash:comments>
		</item>
	</channel>
</rss>

