<?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>Hallan Blog</title>
	<atom:link href="http://blog.hallanmedeiros.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.hallanmedeiros.com</link>
	<description>Tecnologia da Informação</description>
	<lastBuildDate>Mon, 28 Nov 2011 23:49:18 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3</generator>
		<item>
		<title>SQL: Paginando resultados com limit e offset</title>
		<link>http://blog.hallanmedeiros.com/2011/11/23/sql-paginando-resultados-com-limit-e-offset/</link>
		<comments>http://blog.hallanmedeiros.com/2011/11/23/sql-paginando-resultados-com-limit-e-offset/#comments</comments>
		<pubDate>Wed, 23 Nov 2011 23:43:45 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Banco de dados]]></category>

		<guid isPermaLink="false">http://blog.hallanmedeiros.com/?p=458</guid>
		<description><![CDATA[Tanto o MySQL quanto o Postgresql suportam um recurso muito útil para paginação de resultados, chamado de OFFSET, normalmente utilizado com LIMIT. Neste post, veremos como utilizar o LIMIT e o OFFSET para paginar resultados de uma SQL. A cláusula &#8230;<p class="read-more"><a href="http://blog.hallanmedeiros.com/2011/11/23/sql-paginando-resultados-com-limit-e-offset/">Continue lendo &#187;</a></p>]]></description>
			<content:encoded><![CDATA[<p>Tanto o MySQL quanto o Postgresql suportam um recurso muito útil para paginação de resultados, chamado de OFFSET, normalmente utilizado com LIMIT.</p>
<p>Neste post, veremos como utilizar o LIMIT e o OFFSET para paginar resultados de uma SQL.</p>
<p><span id="more-458"></span></p>
<p>A cláusula LIMIT é utilizada para limitar o número de resultados de uma SQL. Então, se sua SQL retornar 1000 linhas, mas você quer apenas as 10 primeiras, você deve executar uma instrução mais ou menos assim:</p>
<pre class="brush: sql; title: ; notranslate">SELECT coluna FROM tabela LIMIT 10;</pre>
<p>Agora, vamos supor que você quer somente os resultados de 11 a 20. Com a instrução OFFSET fica fácil, basta proceder da seguinte forma:</p>
<pre class="brush: sql; title: ; notranslate">SELECT coluna FROM tabela LIMIT 10 OFFSET 10;</pre>
<p>O comando OFFSET indica o início da leitura, e o LIMIT o máximo de registros a serem lidos. Para os registros de 60 a 75, por exemplo:</p>
<pre class="brush: sql; title: ; notranslate">SELECT coluna FROM tabela LIMIT 15 OFFSET 60;</pre>
<p>Com este recurso, fica fácil paginar os resultados de uma SQL e mostrar ao usuário apenas a página, ao invés de retornar todos os registros da tabela. Uma tabela com 2000 registros, por exemplo, fica muito melhor mostrar ao usuário de 10 em 10, por exemplo, e diminui a carga no banco de dados, melhorando a sua performance.</p>
<p>Referência:</p>
<p><a href="http://www.petefreitag.com/item/451.cfm" target="_blank">http://www.petefreitag.com/item/451.cfm</a></p>
<p>Espero ter ajudado.</p>
<p>Abraço!</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.hallanmedeiros.com/2011/11/23/sql-paginando-resultados-com-limit-e-offset/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Criptografia básica em Java</title>
		<link>http://blog.hallanmedeiros.com/2011/11/22/criptografia-basica-em-java/</link>
		<comments>http://blog.hallanmedeiros.com/2011/11/22/criptografia-basica-em-java/#comments</comments>
		<pubDate>Tue, 22 Nov 2011 23:31:55 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Intermediário]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[programação]]></category>
		<category><![CDATA[tutoriais]]></category>

		<guid isPermaLink="false">http://blog.hallanmedeiros.com/?p=446</guid>
		<description><![CDATA[Criptografia é algo muito comum nos sistemas atuais. Quando falamos de segurança, o termo criptografia normalmente está presente. Este post tem como objetivo apresentar a API de criptografia já presente na liguagem java, mais precisamente no pacote java.security. Existem basicamente &#8230;<p class="read-more"><a href="http://blog.hallanmedeiros.com/2011/11/22/criptografia-basica-em-java/">Continue lendo &#187;</a></p>]]></description>
			<content:encoded><![CDATA[<p>Criptografia é algo muito comum nos sistemas atuais. Quando falamos de segurança, o termo criptografia normalmente está presente.</p>
<p>Este post tem como objetivo apresentar a API de criptografia já presente na liguagem java, mais precisamente no pacote <span style="text-decoration: underline;">java.security</span>.</p>
<p><span id="more-446"></span>Existem basicamente dois tipos de algoritmos de criptografia:</p>
<ul>
<li>Os de duas vias (aquele em que é possível descriptografar)</li>
<li>Os de uma via (os que não há como descriptografar, pois o o cálculo matemático efetuado não permite, a partir do valor fim, retornar ao valor inicial).</li>
</ul>
<p>Os algoritmos de uma via podem ser chamados de Message Digests, e são extremamente eficientes para armazenamento de senhas &#8211; e são estas funções que veremos neste post.</p>
<p><span style="color: #800080;"><strong>Message Digest</strong></span></p>
<p>A API do Java implementa dois algoritmos de Message Digest:</p>
<ul>
<li><span style="color: #0000ff;"><a href="http://pt.wikipedia.org/wiki/MD5" target="_blank"><span style="color: #0000ff;">MD5 (Message-Digest algorithm 5)</span></a></span></li>
<li><span style="color: #0000ff;"><a href="http://pt.wikipedia.org/wiki/SHA" target="_blank"><span style="color: #0000ff;">SHA (Secure Hash Algorithm)</span></a></span></li>
</ul>
<p>Em java, temos uma classe MessageDigest que implementa estes algoritmos. Para termos uma instância desta classe, devemos proceder da seguinte forma:</p>
<pre class="brush: java; title: ; notranslate">
//message digest para MD5
MessageDigest md = MessageDigest.getInstance(&quot;MD5&quot;);

//message digest para SHA
MessageDigest md = MessageDigest.getInstance(&quot;SHA-1&quot;);
</pre>
<p>Após selecionar o algoritmo desejado (passando através do método getInstance), podemos proceder da seguinte forma para criptografar uma String:</p>
<pre class="brush: java; title: ; notranslate">
String s = &quot;senha aqui&quot;;
MessageDigest md = MessageDigest.getInstance(&quot;SHA-1&quot;);
md.update( s.getBytes() );
byte[] hash = md.digest();
StringBuffer hexString = new StringBuffer();
for (int i = 0; i &lt; hash.length; i++) {
     if ((0xff &amp; hash[i]) &lt; 0x10)
          hexString.append( &quot;0&quot; + Integer.toHexString((0xFF &amp; hash[i])));
     else
	  hexString.append(Integer.toHexString(0xFF &amp; hash[i]));
}
String criptografado = hexString.toString();
</pre>
<p>Claro que devemos tratar devidamente as exceções (como por exemplo NoSuchAlgorithmException), mas no grosso é o código acima mesmo:</p>
<p>O método<strong> update()</strong> recebe o que deve ser critografado (em array de bytes) e o método<strong> digest()</strong> efetua a criptografia, retornando um array de bytes.</p>
<p>O <em>for</em> percorre os <em>bytes</em> e vai pegando os seus valores e convertendo para <em>String</em> &#8211; concatenando os valores com a classe <em>StringBuilder</em>.</p>
<p>Bom, finalizo aqui um exemplo básico de criptografia com MessageDigest.</p>
<p>&nbsp;</p>
<p>Quanto a criptografia de duas vias, tem um ótimo post no Blog do Ricardo Giaviti. Segue abaixo o link:</p>
<p><a href="http://www.ricardogiaviti.com.br/2010/07/usando-criptografia-em-java/" target="_blank">http://www.ricardogiaviti.com.br/2010/07/usando-criptografia-em-java/</a></p>
<p>Espero ter ajudado!</p>
<p>Abraço</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.hallanmedeiros.com/2011/11/22/criptografia-basica-em-java/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Salvar arquivos em Banco de Dados com Java</title>
		<link>http://blog.hallanmedeiros.com/2011/11/16/salvar-arquivos-em-banco-de-dados-com-java/</link>
		<comments>http://blog.hallanmedeiros.com/2011/11/16/salvar-arquivos-em-banco-de-dados-com-java/#comments</comments>
		<pubDate>Wed, 16 Nov 2011 23:50:50 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Banco de dados]]></category>
		<category><![CDATA[Intermediário]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[programação]]></category>

		<guid isPermaLink="false">http://blog.hallanmedeiros.com/?p=440</guid>
		<description><![CDATA[Uma das questões que surgem quanto ao armazenamento de arquivos (imagens, documentos, etc) é como e onde salvar tais arquivos. Neste post explicarei como salvar e recuperar arquivos em banco de dados (PostgreSQL) com Java. Quando temos um sistema que &#8230;<p class="read-more"><a href="http://blog.hallanmedeiros.com/2011/11/16/salvar-arquivos-em-banco-de-dados-com-java/">Continue lendo &#187;</a></p>]]></description>
			<content:encoded><![CDATA[<p>Uma das questões que surgem quanto ao armazenamento de arquivos (imagens, documentos, etc) é como e onde salvar tais arquivos.<br />
Neste post explicarei como salvar e recuperar arquivos em banco de dados (PostgreSQL) com Java.</p>
<p><span id="more-440"></span></p>
<p>Quando temos um sistema que trabalha com imagens, documentos ou algum tipo de arquivo, temos várias formas de tratar este tipo de funcionalidade. As duas formas mais comuns são:</p>
<p>- Salvar o arquivo em disco (file system) e sua localização no banco de dados (como varchar);</p>
<p>- Salvar o arquivo inteiro dentro do banco de dados.</p>
<p>Existem muita discussão em cima destas duas soluções, então, vou postar aqui os prós e os contras de cada uma delas:<br />
<span style="color: #800080;"><strong>File System &#8211; Vantagens</strong></span></p>
<ul>
<li>Talvez uma das vantagens seja a facilidade de salvar em disco. Basta mandar escrever em um diretório em específico e pronto.</li>
</ul>
<ul>
<li>Outra vantagem seria a facilidade de acesso aos arquivos para backup: basta ir no diretório onde eles estão e mandar compactar tudo <img src='http://blog.hallanmedeiros.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> .</li>
</ul>
<p><span style="color: #800080;"><strong>File System &#8211; Desvantagens</strong></span></p>
<ul>
<li>Uma das desvantagens é o desacoplamento do banco de dados com o arquivo em si. Se você excluir a entidade referente ao arquivo, por exemplo, terá de ir no diertório para excluir o arquivo manualmente. Da mesma forma que a leitura do arquivo não pode ser feita apenas utilizando um JOIN na tabela de arquivos: será necessário, além do SELECT no banco, acessar o arquivo em disco.</li>
</ul>
<ul>
<li>Segurança: o arquivo pode ser facilmente encontrado (ou até mesmo excluído) no disco. Além disso, a aplicação terá de ter permissão de leitura/escrita no diretório em questão &#8211; o que pode ser um problema se tratando de aplicações web.</li>
</ul>
<p><span style="color: #800080;"><strong>Banco de Dados &#8211; Vantagens</strong></span></p>
<ul>
<li>O que é desvantagem em File System se torna vantagem em se tratando de banco de dados. O arquivo pode ser facilmente relacionado a outros registros de outras tabelas. Podem ser recuperados através de JOIN e excluídos com relacionamentos do tipo CASCADE.</li>
</ul>
<ul>
<li>Outra vantagem é que todos os dados estão armazenado em um único local. O backup do banco de dados já contém os arquivos, e a migração do banco de dados para outro local é mais fácil, pois não implica em diretórios e permissões.</li>
</ul>
<p><span style="color: #800080;"><strong>Banco de Dados &#8211; Desvantagens</strong></span></p>
<ul>
<li>Uma das desvantagens seria a performance do banco de dados. Na verdade esta é uma desvantagem &#8220;questionável&#8221;, pois depende muito do hardware, SGBD e carga de usuários. Grandes aplicações (picasaweb, flickr, youtube) utilizam banco de dados para armazenar arquivos &#8211; o que torna esta desvantagem passível de questionamento.</li>
</ul>
<ul>
<li>O backup da base de dados pode ser muito grande (se tiver 1gb de imagens, o backup do banco irá ficar com toda esta carga). Normalmente backups de bancos de dados são armazenados em uma máquina diferente da que etá rodando o SGBD, o que pode ser problemático para arquivos muito grandes.</li>
</ul>
<p>A estratégia depende muito do problema em questão. De qualquer forma, irei explicar aqui como utilizar a estratégia de salvar arquivos diretamente no banco de dados.</p>
<p><span style="color: #0000ff;"><strong>Preparando o Banco de Dados</strong></span></p>
<p>No banco de dados Posrgres, temos a seguinte tabela (e sequência):</p>
<pre class="brush: sql; title: ; notranslate">

CREATE TABLE arquivo (
    id integer NOT NULL,
    nome character varying,
    arquivo bytea,
    CONSTRAINT pk_arquivo PRIMARY KEY (id)
);
CREATE SEQUENCE seq_arquivo INCREMENT 1 START 1;
</pre>
<p>O campo do tipo BYTEA representa um array de bytes, e nesta coluna iremos armazenar os nossos arquivos.</p>
<p><span style="color: #0000ff;"><strong>Enviando o arquivo para o banco de dados</strong></span></p>
<p>Para armazenar um arquivo (File) em java, podemos fazer da seguinte forma:</p>
<pre class="brush: java; title: ; notranslate">

public boolean insertFile( File f ){
    Connection c = this.getConnection();//busca uma conexao com o banco
    try {
        PreparedStatement ps = c.prepareStatement(&quot;INSERT INTO arquivo( id, nome, arquivo ) VALUES ( nextval('seq_arquivo'), ?, ? )&quot;);

        //converte o objeto file em array de bytes
        InputStream is = new FileInputStream( f );
        byte[] bytes = new byte[(int)f.length() ];
        int offset = 0;
        int numRead = 0;
        while (offset &lt; bytes.length
               &amp;&amp; (numRead=is.read(bytes, offset, bytes.length-offset)) &gt;= 0) {
            offset += numRead;
        }

        ps.setString( 1, f.getName() );
        ps.setBytes( 2, bytes );
        ps.execute();
        ps.close();
        c.close();
        return true;

    } catch (SQLException ex) {
        ex.printStackTrace();
    } catch (IOException ex) {
        ex.printStackTrace();
    }
    return false;
}
</pre>
<p>Entendendo o método: primeiro, convertemos o arquivo para um array de bytes (byte []). Depois, utilizamos o setBytes do PreparedStatement para armazenar o arquivo na coluna especificada.</p>
<p>E pronto: ao utilizar este método, guardamos o nome e o arquivo em si em uma tabela no banco de dados.</p>
<p><span style="color: #0000ff;"><strong>Recuperando o arquivo do banco de dados</strong></span></p>
<p>Para recuperar o arquivo do banco de dados e salvar ele em disco (File) em java, podemos fazer da seguinte forma:</p>
<pre class="brush: java; title: ; notranslate">

public File getFile( int id ){
    Connection c = this.getConnection();//busca uma conexao com o banco
    File f = null;
    try {
        PreparedStatement ps = c.prepareStatement(&quot;SELECT id, nome, arquivo FROM arquivo WHERE id = ?&quot;);
        ps.setInt(1, id);
        ResultSet rs = ps.executeQuery();
        if ( rs.next() ){
            byte [] bytes = rs.getBytes(&quot;arquivo&quot;);
            String nome = rs.getString(&quot;nome&quot;);

            //converte o array de bytes em file
            f = new File( &quot;/local_a_ser_salvo/&quot; + nome );
            FileOutputStream fos = new FileOutputStream( f);
            fos.write( bytes );
            fos.close();
        }
        rs.close();
        ps.close();
        c.close();
        return f;
} catch (SQLException ex) {
ex.printStackTrace();
}
catch (IOException ex) {
ex.printStackTrace();
}
return null;
}
</pre>
<p>O procedimento é o inverso: retorna o valor da coluna em array de bytes e cria um arquivo em disco a partir destes bytes.</p>
<p>Claro que este é um exemplo simples: em cenários mais &#8220;profissionais&#8221;, o arquivo recuperado nem precisa ser salvo em disco: pode ser mantido em memória (byte array) e enviado para a tela &#8220;renderizar&#8221; o arquivo.</p>
<p>Abraço!</p>
<p>Referência: <a href="http://imar.spaanjaars.com/414/storing-uploaded-files-in-a-database-or-in-the-file-system-with-aspnet-20" target="_blank">http://imar.spaanjaars.com/414/storing-uploaded-files-in-a-database-or-in-the-file-system-with-aspnet-20</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.hallanmedeiros.com/2011/11/16/salvar-arquivos-em-banco-de-dados-com-java/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Escrever e Ler arquivos com Java</title>
		<link>http://blog.hallanmedeiros.com/2011/02/22/ecrever-e-ler-arquivos-com-java/</link>
		<comments>http://blog.hallanmedeiros.com/2011/02/22/ecrever-e-ler-arquivos-com-java/#comments</comments>
		<pubDate>Tue, 22 Feb 2011 23:55:23 +0000</pubDate>
		<dc:creator>Hallan</dc:creator>
				<category><![CDATA[Intermediário]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[programação]]></category>
		<category><![CDATA[tutoriais]]></category>

		<guid isPermaLink="false">http://blog.hallanmedeiros.com/?p=326</guid>
		<description><![CDATA[Manipulando arquivos com Java Praticamente todos que trabalham com desenvolvimento, de uma forma ou de outra, acabam tendo que manipular arquivos, sejam eles de texto, planilhas ou gerar relatórios. Neste post explicarei como manipular arquivos com Java, bem como escrever &#8230;<p class="read-more"><a href="http://blog.hallanmedeiros.com/2011/02/22/ecrever-e-ler-arquivos-com-java/">Continue lendo &#187;</a></p>]]></description>
			<content:encoded><![CDATA[<p>Manipulando arquivos com Java</p>
<p>Praticamente todos que trabalham com desenvolvimento, de uma forma ou de outra, acabam tendo que manipular arquivos, sejam eles de texto, planilhas ou gerar relatórios.<br />
Neste post explicarei como manipular arquivos com Java, bem como escrever e ler arquivos no formato de texto (txt).</p>
<p><span id="more-326"></span></p>
<p>A manipulação de arquivos em Java acontece de forma simples e rápida, pois a linguagem dispõe de classes que executam praticamente todas as operações necessárias para tanto.</p>
<p><span style="color: #800080;"><strong>java.io.File</strong></span></p>
<p>A classe File representa um arquivo ou diretório no sistema operacional. Importante saber que apenas REPRESENTA, não significa que o arquivo ou diretório realmente exista.</p>
<p>Para instanciar um objeto do tipo File:</p>
<pre class="brush: java; title: ; notranslate">

File arquivo = new File( "/home/hallan/nome_do_arquivo.txt" );
</pre>
<p>Com o objeto instanciado, é possível fazer algumas verificações, como por exemplo se o arquivo ou diretório existe:</p>
<pre class="brush: java; title: ; notranslate">
//verifica se o arquivo ou diretório existe
boolean existe = arquivo.exists();
</pre>
<p>Caso não exista, é possível criar um arquivo ou diretório:</p>
<pre class="brush: java; title: ; notranslate">
//cria um arquivo (vazio)
arquivo.createNewFile();

//cria um diretório
arquivo.mkdir();
</pre>
<p>caso seja um diretório, é possível listar seus arquivos e diretórios através do método listFiles(), que retorna um vetor de File:</p>
<pre class="brush: java; title: ; notranslate">
//caso seja um diretório, é possível listar seus arquivos e diretórios
File [] arquivos = arquivo.listFiles();
</pre>
<p>É possível também excluir o arquivo ou diretório através do método delete(). Uma observação importante é que, caso seja um diretório, para poder excluir, este tem de estar vazio:</p>
<pre class="brush: java; title: ; notranslate">
//exclui o arquivo ou diretório
arquivo.delete();
</pre>
<p><span style="color: #800080;"><strong><br />
java.io.FileWriter e java.io.BufferedWriter</strong></span></p>
<p>As classes FileWriter e BufferedWriter servem para escrever em arquivos de texto.</p>
<p>A classe FileWriter serve para escrever diretamente no arquivo, enquanto a classe BufferedWriter, além de ter um desempenho melhor, possui alguns métodos que são independentes de sistema operacional, como quebra de linhas.</p>
<p>Para instanciar um objeto do tipo FileWriter:</p>
<pre class="brush: java; title: ; notranslate">
//construtor que recebe o objeto do tipo arquivo
FileWriter fw = new FileWriter( arquivo );

//construtor que recebe também como argumento se o conteúdo será acrescentado
//ao invés de ser substituído (append)
FileWriter fw = new FileWriter( arquivo, true );
</pre>
<p>A criação do objeto BufferedWriter:</p>
<pre class="brush: java; title: ; notranslate">
//construtor recebe como argumento o objeto do tipo FileWriter
BufferedWriter bw = new BufferedWriter( fw );
</pre>
<p>Com o bufferedwriter criado, agora é possível escrever conteúdo no arquivo através do método write():</p>
<pre class="brush: java; title: ; notranslate">
//escreve o conteúdo no arquivo
bw.write( "Texto a ser escrito no txt" );

//quebra de linha
bw.newLine();
</pre>
<p>Após escrever tudo que queria, é necessário fechar os buffers e informar ao sistema que o arquivo não está mais sendo utilizado:</p>
<pre class="brush: java; title: ; notranslate">
//fecha os recursos
bw.close();
fw.close();
</pre>
<p><span style="color: #800080;"><strong>java.io.FileReader e java.io.BufferedReader</strong></span></p>
<p>As classes FileReader e BufferedReader servem para ler arquivos em formato texto.</p>
<p>A classe FileReader recebe como argumento o objeto File do arquivo a ser lido:</p>
<pre class="brush: java; title: ; notranslate">
//construtor que recebe o objeto do tipo arquivo
FileReader fr = new FileReader( arquivo );
</pre>
<p>A classe BufferedReader, fornece o método readLine() para leitura do arquivo:</p>
<pre class="brush: java; title: ; notranslate">
//construtor que recebe o objeto do tipo FileReader
BufferedReader br = new BufferedReader( fr );
</pre>
<p>Para ler o arquivo, basta utilizar o método ready(), que retorna se o arquivo tem mais linhas a ser lido, e o método readLine(), que retorna a linha atual e passa o buffer para a próxima linha:</p>
<pre class="brush: java; title: ; notranslate">
//equanto houver mais linhas
while( br.ready() ){
//lê a proxima linha
String linha = br.readLine();

//faz algo com a linha
}
</pre>
<p>Da mesma forma que a escrita, a leitura deve fechar os recursos:</p>
<pre class="brush: java; title: ; notranslate">
br.close();
fr.close();
</pre>
<p>Agora, o código completo de escrita e leitura do arquivo:</p>
<pre class="brush: java; title: ; notranslate">
public static void main(String[] args) {

File arquivo = new File("/home/hallan/nome_do_arquivo.txt");

try {

if (!arquivo.exists()) {
//cria um arquivo (vazio)
arquivo.createNewFile();
}

//caso seja um diretório, é possível listar seus arquivos e diretórios
File[] arquivos = arquivo.listFiles();

//escreve no arquivo
FileWriter fw = new FileWriter(arquivo, true);

BufferedWriter bw = new BufferedWriter(fw);

bw.write("Texto a ser escrito no txt");

bw.newLine();

bw.close();
fw.close();

//faz a leitura do arquivo
FileReader fr = new FileReader(arquivo);

BufferedReader br = new BufferedReader(fr);

//equanto houver mais linhas
while (br.ready()) {
//lê a proxima linha
String linha = br.readLine();

//faz algo com a linha
System.out.println(linha);
}

br.close();
fr.close();

} catch (IOException ex) {
ex.printStackTrace();
}

}
</pre>
<p>Abraço!</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.hallanmedeiros.com/2011/02/22/ecrever-e-ler-arquivos-com-java/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Java e Datas</title>
		<link>http://blog.hallanmedeiros.com/2011/02/15/java-e-datas/</link>
		<comments>http://blog.hallanmedeiros.com/2011/02/15/java-e-datas/#comments</comments>
		<pubDate>Tue, 15 Feb 2011 18:05:43 +0000</pubDate>
		<dc:creator>Hallan</dc:creator>
				<category><![CDATA[Intermediário]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[programação]]></category>
		<category><![CDATA[tutoriais]]></category>

		<guid isPermaLink="false">http://blog.hallanmedeiros.com/?p=322</guid>
		<description><![CDATA[Voltando a ativa, tendo em vista a dificuldade que as pessoas que estão iniciando com java tem com manipulação de datas e também a sugestão de alguns dos meus alunos, decidi criar um post sobre datas em Java. Neste post &#8230;<p class="read-more"><a href="http://blog.hallanmedeiros.com/2011/02/15/java-e-datas/">Continue lendo &#187;</a></p>]]></description>
			<content:encoded><![CDATA[<p>Voltando a ativa, tendo em vista a dificuldade que as pessoas que estão iniciando com java tem com manipulação de datas e também a sugestão de alguns dos meus alunos, decidi criar um post sobre datas em Java.</p>
<p>Neste post explicarei como utilizar as classes <strong>java.util.Date</strong>, <strong>java.util.GregorianCalendar</strong> e java.<strong>text.SimpleDateFormat</strong>.<br />
<span id="more-322"></span></p>
<p><span style="color: #800080;"><strong>java.util.Date</strong></span></p>
<p>A Classe java.util.Date serve para armazenar uma data em específico. É uma classe simples, e muitos componentes de bibliotecas e Frameworks utilizam esta classe.</p>
<p>Para instanciar uma nova data, basta utilizar o comando:</p>
<pre class="brush: java; title: ; notranslate">
Date data = new Date();
</pre>
<p>Não esquecendo, claro, de importar a Classe.</p>
<p>A data é instanciada com a data atual do computador.</p>
<p>O problema é quando é necessário alterar a data para um dia, mês ou ano em específico. Os métodos setMonth, setDate e setYear estão <a href="http://pt.wikipedia.org/wiki/Deprecia%C3%A7%C3%A3o" target="_blank">depreciados</a>, pois o ano é acrescentado automaticamente a 1900.</p>
<p>Isto funcionava muito bem antes do ano 2000, pois se fosse para setar o ano para 1997, bastava fazer um setYear( 97 ). Agora para 2006, é necessário fazer um setYear( 106 ). Não é muito bonito.</p>
<p>O ideal é usar a classe GregorianCalendar que implementa o <a href="http://pt.wikipedia.org/wiki/Calend%C3%A1rio_gregoriano" target="_blank">calendário gregoriano</a>, como veremos mais a frente.</p>
<p><span style="color: #800080;"><strong>java.text.SimpleDateFormat</strong></span></p>
<p>A classe java.text.SimpleDateFormat é uma classe utilitária que serve para converter tanto de <span style="text-decoration: underline;">String para Date</span> quanto de <span style="text-decoration: underline;">Date para String</span>. Muito útil quando tem que transformar um campo digitado pelo usuário para Date ou mostrar uma data em um formato em específico.</p>
<p>Para utilizar a classe</p>
<pre class="brush: java; title: ; notranslate">

//instancia o objeto passando no construtor a máscara da data
SimpleDateFormat sdf = new SimpleDateFormat( &quot;dd/MM/yyyy&quot; );

//Para converter de String para Date:
java.util.Date data = sdf.parse(&quot;21/04/2011&quot;);

//converter de Date para String
String data = sdf.format( data );
</pre>
<p><span style="color: #800080;"><strong>java.util.GregorianCalendar</strong></span></p>
<p>Quando é necessário efetuar operações com datas, a classe Date já não serve muito bem. A classe GregorianCalendar, além de ajustar alguns problemas que ocorrem com a classe Date, serve para efetuar operações mais complexas com datas.</p>
<p>Para instanciar um objeto do tipo GregorianCalendar:</p>
<pre class="brush: java; title: ; notranslate">
//construtor sem argumentos
GregorianCalendar data = new GregorianCalendar();
</pre>
<p>Da mesma forma que um Date, o GregorianCalendar vem como padrão a data atual do sistema.</p>
<p>Um outro construtor da classe permite passar o ano, mês e dia da data:</p>
<pre class="brush: java; title: ; notranslate">
//construtor que recebe o ano, mes e dia
GregorianCalendar data2 = new GregorianCalendar( 2011, 0, 1 );
</pre>
<p>Um detalhe importante é que o mês vai de 0 (janeiro) a 11 (dezembro).</p>
<p><strong>Métodos de manipulação de data:</strong></p>
<p><span style="text-decoration: underline;">data.set( campo, valor )</span></p>
<p>Este método seta o valor de um campo específico. Os campos são constantes da classe, conforme abaixo:</p>
<pre class="brush: java; title: ; notranslate">

//altera o dia para 1
data.set( GregorianCalendar.DAY_OF_MONTH , 1);

//altera o mês para abril
data.set( GregorianCalendar.MONTH , 3);

//altera o ano para 2012
data.set( GregorianCalendar.YEAR , 2012);
</pre>
<p><span style="text-decoration: underline;">data.get( campo )</span></p>
<p>Este método retorna um campo específico da data. Os campos são as mesmas constantes listadas no exemplo do método set acima:</p>
<pre class="brush: java; title: ; notranslate">

int dia = data.get( GregorianCalendar.DAY_OF_MONTH );
int mes = data.get( GregorianCalendar.MONTH );
</pre>
<p><span style="text-decoration: underline;">data.add( campo, valor )</span></p>
<p>Este método adiciona um valor a um campo. Exemplo:</p>
<pre class="brush: java; title: ; notranslate">
//adiciona 2 meses a data atual
data.add( GregorianCalendar.MONTH , 2);
</pre>
<p><span style="text-decoration: underline;">data.before( outraData )</span> e <span style="text-decoration: underline;">data.after( outraData )</span></p>
<p>Este método verifica se uma data é anterior ou posterior a outra data.</p>
<p>Exemplo:</p>
<pre class="brush: java; title: ; notranslate">
//construtor sem argumentos
GregorianCalendar data = new GregorianCalendar();

//construtor que recebe o ano, mes e dia
GregorianCalendar data2 = new GregorianCalendar( 2011, 0, 1 );

if ( data.after( data2 ) ){
 //caso a data seja após a data 2, entra neste IF
}
</pre>
<p><span style="color: #800080;"><strong>Convertendo entre Date e GregorianCalendar</strong></span></p>
<p>Para converter um objeto de Date para GregorianCalendar:</p>
<pre class="brush: java; title: ; notranslate">
//objeto do tipo Date
Date date = new Date();

//cria o GregorianCalendar e utiliza o método setTime
GregorianCalendar gc = new GregorianCalendar();
gc.setTime( date );
</pre>
<p>Para converter um objeto de GregorianCalenda para Date:</p>
<pre class="brush: java; title: ; notranslate">
Date date = gc.getTime();
</pre>
<p>O método getTime() do GregorianCalendar retorna um objeto do tipo Date.</p>
<p><span style="color: #800080;"><strong><br />
Resolvendo operações de dias, meses e anos entre datas</strong></span></p>
<p>Tanto as classes Date como GregorianCalendar possuem métodos para retornar a data em milissegundos passados desde a data de 1/jan/1970.</p>
<p>Na classe Date, o método se chama <strong>getTime</strong>;<br />
Em GregorianCalendar, o método se chama <strong>getTimeInMillis</strong>;</p>
<p>A partir disto, é possível calcular, em milissegundos, a diferença entre uma data e outra., para então converter para dias, meses, anos e etc.</p>
<p>Exemplo com GregorianCalendar:</p>
<pre class="brush: java; title: ; notranslate">

long milissegundos = gc.getTimeInMillis() - gc2.getTimeInMillis();
long dias = milissegundos / (24*60*60*1000);
</pre>
<p>Mas o que significa esses números?</p>
<p>É que a diferença é em milissegundos. Para chegar a dias, é necessário dividir por milissegundos (1000), por segundos (60), por minutos (60) e por horas (24).</p>
<p>Espero ter ajudado.</p>
<p>Abraço!</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.hallanmedeiros.com/2011/02/15/java-e-datas/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Frameworks</title>
		<link>http://blog.hallanmedeiros.com/2010/09/15/frameworks/</link>
		<comments>http://blog.hallanmedeiros.com/2010/09/15/frameworks/#comments</comments>
		<pubDate>Wed, 15 Sep 2010 14:16:40 +0000</pubDate>
		<dc:creator>Hallan</dc:creator>
				<category><![CDATA[Conceitos]]></category>

		<guid isPermaLink="false">http://blog.hallanmedeiros.com/?p=276</guid>
		<description><![CDATA[Hoje, a utilização de Frameworks para agilizar o processo de desenvolvimento é cada vez mais comum. Conhecer e saber utilizar determinados Frameworks, em muitos casos, chega a se tornar um pré-requisito. Neste post, tentarei explicar o que é são Frameworks,  &#8230;<p class="read-more"><a href="http://blog.hallanmedeiros.com/2010/09/15/frameworks/">Continue lendo &#187;</a></p>]]></description>
			<content:encoded><![CDATA[<p>Hoje, a utilização de Frameworks para agilizar o processo de desenvolvimento é cada vez mais comum. Conhecer e saber utilizar determinados Frameworks, em muitos casos, chega a se tornar um pré-requisito.</p>
<p>Neste post, tentarei explicar o que é são Frameworks,  e exemplificar alguns dos mais comuns para JEE.</p>
<p><span id="more-276"></span>Existem muitas definições do que é um Framework. As mais clássicas:</p>
<ul>
<li>“<em>A framework is a set of classes that embodies an abstract design for     solutions to a family of related problems</em>” [Johnson and Foot, 1988]</li>
<li>“<em>A framework is a set of objetcts that collaborate to carry out a set of responsabilities for an application subsystem domain</em>&#8221; [Damian, 1991]</li>
<li>“<em>A framework is an architecture developed with the objective to obtain the maximum reuse, represented as a group of abstract and concrete classes, with a great potetnial specialization</em>” [Mattsson, 1996]</li>
</ul>
<p>Podemos dizer então que um Framework consiste em um conjunto de classes e/ou objetos (ou uma arquitetura) já desenvolvidos que tem como objetivo obter o máximo da reutilização, e que tem como responsabilidade prover uma solução para um conjunto de problemas.</p>
<p>O conjunto de classes de um Framework deve ser<span style="color: #000000;"> </span><span style="color: #000000;">flexível e  extensível </span>para         permitir a construção de várias aplicações com pouco esforço,  especificando apenas         as particularidades de cada aplicação.</p>
<p>Pode-se dizer ainda que Frameworks são projetos reutilizáveis de todo ou parte de um sistema de software, descrito por um conjunto de classes abstratas e a forma como as instâncias destas classes se relacionam.</p>
<p>Um bom Framework pode reduzir o custo <span id="result_box"><span style="background-color: #ffffff;"> do desenvolvimento de uma aplicação</span></span><span id="result_box"><span style="background-color: #ffffff;">, por uma ordem  de grandeza, pois permite a reutilização de  design e código.</span></span></p>
<p><span style="color: #0000ff;"><span style="text-decoration: underline;"><strong>Diferença entre Frameworks e Bibliotecas de Classes</strong></span></span></p>
<p>Uma biblioteca de classe (lib) consiste em uma coleção de sub-rotinas ou classes prontas, que tem como objetivo a reutilização de código.</p>
<p>Uma biblioteca se preocupa apenas em oferecer implementação de funcionalidades, enquanto o Framework define a reutilização de uma arquitetura (pattern) completo.</p>
<p>Ao utilizar uma biblioteca, o desenvolvedor define com as classes irão interagir. Em um Framework, as relações entre as classes já estão definidas: é o desenvolvedor que se adapta ao padrão (design) que já foi proposto pelo Framework.</p>
<p><span style="color: #0000ff;"><span style="text-decoration: underline;"><strong>Diferença entre Frameworks e Design Patterns</strong></span></span></p>
<p>Um Design Pattern (ou Padrão de Projeto) descreve como uma solução deve ser implementada para resolver determinado problema. Desta forma, um Design Pattern não possui código, possui apenas um modelo de arquitetura a ser seguido.</p>
<p>Um design pattern é mais abstrato que um Framework, justamente pela ausência de código.</p>
<p>Uma Framework, em sua implementação, pode seguir um ou mais Padrões de Projeto <img src='http://blog.hallanmedeiros.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p><span style="color: #0000ff;"><span style="text-decoration: underline;"><strong>Frameworks Conceituais</strong></span></span></p>
<p>O conceito de Framework aqui descrito se refere a Framewroks Computacionais. Existem também os Frameworks Conceituais, que é um conjunto de conceitos usado para resolver um problema de um domínio específico.</p>
<p>Como exemplos de Frameworks Conceituais para governança de TI, temos o  <a href="http://www.isaca.org/Knowledge-Center/COBIT/Pages/Overview.aspx" target="_blank">COBIT</a> e o <a href="http://www.itil-officialsite.com/home/home.asp" target="_blank">ITIL</a>.</p>
<p><span style="text-decoration: underline;"><span style="color: #800080;"><strong><span style="color: #0000ff;">Exemplos de Frameworks</span><br />
</strong></span></span></p>
<p><a href="http://www.hibernate.org/" target="_blank"><strong>Hibernate: </strong></a>Amplamente utilizado para persistência de dados e mapeamento objeto-relacional;</p>
<p><span style="color: #0000ff;"><a href="http://www.oracle.com/technetwork/java/javaee/javaserverfaces-139869.html" target="_blank"><strong>Java Server Faces: </strong></a></span>Utilizado para desenvolvimento de interfaces gráficas em aplicações Java EE;</p>
<p><a href="http://struts.apache.org/" target="_blank"><strong>Struts:</strong></a> Utilizado para auxiliar a implementar o modelo MVC em aplicações Java  EE;</p>
<p><a href="http://junit.org/" target="_blank"><strong>JUnit:</strong></a> Utilizado para realização de testes unitários;</p>
<p><a href="http://www.adobe.com/products/flex/" target="_blank"><strong>Flex:</strong></a> utilizado para desenvolver interfaces gráficas sobre a plataforma Adobe Flash.</p>
<p>Estes são apenas alguns exemplos de vários Frameworks existentes.</p>
<p>Fico por aqui.</p>
<p>Abraço!</p>
<p>Referências:</p>
<p><a href="http://st-www.cs.illinois.edu/users/johnson/frameworks.html" target="_blank">http://st-www.cs.illinois.edu/users/johnson/frameworks.html</a></p>
<p><a href="http://st-www.cs.illinois.edu/users/droberts/evolve.html" target="_blank">http://st-www.cs.illinois.edu/users/droberts/evolve.html</a></p>
<p><a href="http://www.dsc.ufcg.edu.br/~jacques/cursos/map/html/frame/oque.htm" target="_blank">http://www.dsc.ufcg.edu.br/~jacques/cursos/map/html/frame/oque.htm</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.hallanmedeiros.com/2010/09/15/frameworks/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Ética Profissional</title>
		<link>http://blog.hallanmedeiros.com/2010/06/28/etica-profissional/</link>
		<comments>http://blog.hallanmedeiros.com/2010/06/28/etica-profissional/#comments</comments>
		<pubDate>Mon, 28 Jun 2010 15:14:41 +0000</pubDate>
		<dc:creator>Hallan</dc:creator>
				<category><![CDATA[Dicas]]></category>
		<category><![CDATA[comportamento]]></category>

		<guid isPermaLink="false">http://blog.hallanmedeiros.com/?p=267</guid>
		<description><![CDATA[Recentemente tive uma aula muito boa sobre ética profissional na área de TI. Á ética na área de TI é dificultada por vários fatores. Um deles, talvez o mais agravante, é o fato de que qualquer pessoa poder trabalhar na &#8230;<p class="read-more"><a href="http://blog.hallanmedeiros.com/2010/06/28/etica-profissional/">Continue lendo &#187;</a></p>]]></description>
			<content:encoded><![CDATA[<p>Recentemente tive uma aula muito boa sobre ética profissional na área de TI.</p>
<p>Á ética na área de TI é dificultada por vários fatores. Um deles, talvez o mais agravante, é o fato de que qualquer pessoa poder trabalhar na área, inclusive pessoas sem um curso superior.  Outro problema grave é que no Brasil não existe um código de ética oficial como em outras áreas, por exemplo:  medicina e direito.</p>
<p>A promiscuidade e falta de confiança nos profissionais de TI está intimamente ligada a falta de ética na nossa área.</p>
<p><span id="more-267"></span>Por não ser uma profissão regulamentada, não existe nenhum órgão que efetivamente seja responsável por fiscalizar e zelar pelo bom desempenho profissional na nossa área.</p>
<p>Desta forma, está na mão de cada um, por em prática a ética profissional.</p>
<p>Infelizmente, hoje, é muito comum na área da computação um profissional praticar um ato desonesto ou desonrado sobre algum cliente, sistema ou até mesmo sobre outro profissional.</p>
<p>A área da computação está presente hoje em praticamente todas as outras áreas de conhecimento. Normalmente, um profissional de TI possui um conhecimento muito grande sobre um negócio ou problema, tem acesso a informações sigilosas e, não raro, existe uma grande dependência da nossa área por parte dos profissionais de outras áreas.</p>
<p>Por consequência, atitudes como quebra de sigilo, revelação de dados de negócio de uma empresa para outra concorrente, pirataria,  e todo tipo de má conduta é algo comum na área da computação.</p>
<p>Existem algumas sociedades que já discutiram e até mesmo elencaram uma série de &#8220;imperativos&#8221; considerados como uma boa prática para o bom profissionalismo para a área de TI. Talvez o mais expressivo seja a <a title="ACM.org" href="http://www.acm.org" target="_blank">ACM</a> (Association for Computer Machinery), sociedade americana que propôs um <a title="ACM Code of Ethics and Professional Conduct" href="http://www.acm.org/about/code-of-ethics" target="_blank">Código de Ética e Conduta Profissional</a>, em 16/10/1992.</p>
<p>Todo profissional da área de TI deveria ao menos ter conhecimento deste código de ética. Não só isso: todo profissional deveria praticar os imperativos propostos por este código de ética.</p>
<p>Alguns dos imperativos propostos:</p>
<p><em><strong>1 &#8211; CONSIDERAÇÕES ÉTICAS FUNDAMENTAIS</strong></em></p>
<p><strong>1.1 &#8211; Contribuir para a sociedade e bem-estar do ser humano</strong></p>
<p>O maior valor da computação é o seu potencial de melhorar o bem-estar do   indivíduo e da sociedade como um todo. Assim, profissionais da  computação devem  estar comprometidos a desenvolver, expandir e usar a sua ciência para o  benefício da humanidade, minimizando as conseqüências negativas dos  sistemas de  computação, incluindo ameaças à saúde e segurança. Um profissional da  computação  que projeta e desenvolve sistemas deve estar alerta e alertar os outros  para  qualquer dano ao ambiente local ou global.</p>
<p><strong>1.2- Evitar de prejudicar outros.</strong></p>
<p>Este princípio proíbe o uso da tecnologia se esta resultar em  dano a:  usuários, estado, empregados, empregadores. Ações nocivas incluem  destruição ou  modificação intencional de arquivos e programas que conduzam a séria  perda de  recursos ou gasto desnecessário de recursos humanos como o tempo e  esforço  requeridos para eliminar &#8220;virus&#8221; de sistemas. Para minimizar a  possibilidade de  prejudicar outros indiretamente, os profissionais da computação devem  minimizar  problemas operacionais usando padrões para projetar e testar sistemas.</p>
<p><strong>1.3- Ser honesto e digno de confiança.</strong></p>
<p>O profissional honesto não deve fazer declarações falsas ou  queixas  depreciativas sobre um sistema ou projeto de sistema. Um profissional da   computação deve ser honesto a respeito de suas próprias qualificações e  sobre  quaisquer circunstâncias que possam levar a conflitos de interesses.</p>
<p><strong>1.4- Ser imparcial e realizar ações sem discriminação.</strong></p>
<p>Os valores de igualdade, tolerância, respeito pelos outros, e os  princípios  de justiça igualitária governam este ítem. Discriminações na base de  qualquer  característica social como raça, sexo, religião, idade, invalidez ou  origem não será tolerada. Em  uma  sociedade justa, todos os indivíduos devem ter igualdade de  oportunidades e de  benefícios do uso de recursos computacionais, a despeito de suas  características.</p>
<p><strong>1.5- Honrar direitos de propriedade incluido copyrights e  patentes.</strong></p>
<p>Violação de copyrights, patentes, acordos de licenciamento é  proibida por lei  na maioria das circunstâncias. Mesmo não havendo proteção, estas  violações são  contrárias ao comportamento profissional.</p>
<p><strong>1.6- Conceder créditos apropriados para propriedades  intelectuais.</strong></p>
<p>Profissionais da computação são obrigados a proteger a  integridade da  propriedade intelectual. Especificamente, não é permitido usar idéias de  outros  ou obter créditos por trabalho de outros, mesmo em casos onde o trabalho  não  está explicitamente protegido por qualquer meio, incluindo copyright e  patente.</p>
<p><strong>1.7- Acessar recursos computacionais e de comunicação somente  quando  autorizado.</strong></p>
<p>Indivíduos e organizações têm o direito de restringir o acesso  aos seus  sistemas, desde que nao viole o ítem 1.4. Ninguém deve entrar ou usar  sistemas,  softwares ou arquivos de outros sem permissão. Sempre deve ser obtida a  aprovação antes de usar recursos, incluindo canais de comunicação,  arquivos,  periféricos e tempo de máquina.</p>
<p><strong>1.8- Respeitar a privacidade de outros.</strong></p>
<p>É responsabilidade dos profissionais manter a privacidade e  integridade de  dados de indivíduos. Isto inclui tomar precauções para assegurar a  precisão dos  dados, como também protegê-los de acesso acidental a indivíduos não  autorizados.  Devem ser planejados procedimentos para permitir aos indivíduos rever  seus  registros e corrigir imprecisões. Este imperativo implica que somente a  quantidade necessária de informações pessoais deve ser armazenada em um  sistema,  que o período de retenção e eliminação para estas informações devem ser  claramente definidas e cumpridas e que informações pessoais obtidas para  um  propósito específico não podem ser usada para outros fins sem o  consentimento do  indivíduo.</p>
<p><strong>1.9- Honrar a confidencialidade.</strong></p>
<p>O princípio da honestidade se estende a questões de  confidencialidade de  informações sempre que alguém faz uma promessa explícita de honrar a  confidencialidade ou, implicitamente, quando informações privadas não  diretamente relacionadas às obrigações de alguém se tornam disponíveis.</p>
<p>Outros imperativos adicionais, sobre liderança e concordância com o código também são propostos.</p>
<p>Alguns exemplos simples de falta de ética profissional na área de TI:</p>
<ul>
<li><span style="text-decoration: underline;"><em>Enganar ou tirar vantagem de alguém que não seja da área:</em></span> dizer que não é possível fazer algo que na realidade é, explicação errônea sobre algo, venda de algo que não é necessário dizendo que é, entre outros;</li>
<li><em><span style="text-decoration: underline;">Quebra de sigilo</span>:</em> sair de uma empresa para outra e fornecer dados ou levar informações da empresa antiga, dar acesso a informações sigilosas para terceiros;</li>
<li><span style="text-decoration: underline;"><em>Discriminação:</em></span> não fornecer informações sobre computação para pessoas por julgar que as mesmas não vão entender. Será ela que não entende ou você que não sabe explicar?</li>
<li><em><span style="text-decoration: underline;">Pirataria:</span></em> Sem maiores explicações. A pirataria hoje é tão comum quanto beber água. O que você faria se um software ou serviço criado por você fosse pirateado por ai?</li>
<li><span style="text-decoration: underline;"><em>Conceder créditos apropriados: </em></span>não reconhecer um esforço de alguém da equipe, ou pior: tomar para si uma idéia ou esforço de outro colega de trabalho;</li>
<li><span style="text-decoration: underline;"><em>Prejudicar os outros: </em></span>sair de uma empresa sem dar nenhum suporte às antigas responsabilidades, ou até pior: excluir arquivos ou códigos de sistemas de forma proposital.</li>
</ul>
<p>Isso tudo sem contar casos onde pessoas infectam computadores com vírus de forma proposital, invadem sistemas ou sites, entre outros crimes computacionais.</p>
<p>A aderência do código da ACM ou qualquer outro similar, hoje, é voluntária. Cabe a cada um agir de acordo com o seu caráter.</p>
<p>Referências:</p>
<p><a href="http://www.acm.org/about/code-of-ethics" target="_blank">http://www.acm.org/about/code-of-ethics</a></p>
<p><a href="http://ia.ucpel.tche.br/~lpalazzo/Aulas/CS/Codigo%20de%20Etica%20e%20Conduta%20Profissional%20da%20ACM.htm" target="_blank">http://ia.ucpel.tche.br/~lpalazzo/Aulas/CS/Codigo%20de%20Etica%20e%20Conduta%20Profissional%20da%20ACM.htm</a></p>
<p><a href="http://www.sied.com.br/sys/prof_arquivos/A%20%C3%A9tica%20do%20profissional%20da%20inform%C3%A1tica.htm" target="_blank">http://www.sied.com.br/sys/prof_arquivos/A%20%C3%A9tica%20do%20profissional%20da%20inform%C3%A1tica.htm</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.hallanmedeiros.com/2010/06/28/etica-profissional/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>JAAS &#8211; Como utilizar com Banco de Dados</title>
		<link>http://blog.hallanmedeiros.com/2010/05/26/jaas-como-utilizar-com-banco-de-dados/</link>
		<comments>http://blog.hallanmedeiros.com/2010/05/26/jaas-como-utilizar-com-banco-de-dados/#comments</comments>
		<pubDate>Wed, 26 May 2010 14:41:46 +0000</pubDate>
		<dc:creator>Hallan</dc:creator>
				<category><![CDATA[Intermediário]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Tomcat]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[JAAS]]></category>
		<category><![CDATA[programação]]></category>
		<category><![CDATA[tutoriais]]></category>

		<guid isPermaLink="false">http://blog.hallanmedeiros.com/?p=258</guid>
		<description><![CDATA[Bom, dando sequencia a um post antigo, neste post explicarei como utilizar o JAAS com banco de dados. Este post parte da premissa que o leitor ja esteja familiarizado com o JAAS (post anterior), e serve apenas para o container &#8230;<p class="read-more"><a href="http://blog.hallanmedeiros.com/2010/05/26/jaas-como-utilizar-com-banco-de-dados/">Continue lendo &#187;</a></p>]]></description>
			<content:encoded><![CDATA[<p>Bom, dando sequencia a um post antigo, neste post explicarei como utilizar o JAAS com banco de dados.</p>
<p>Este post parte da premissa que o leitor ja esteja familiarizado com o JAAS (<a href="http://blog.hallanmedeiros.com/2009/07/21/jaas-como-utilizar-jaas-com-jsp-tomcat/" target="_blank">post anterior</a>), e serve apenas para o container Tomcat.</p>
<p><span id="more-258"></span>Antes de tudo, a estrutura do JAAS em um banco de dados deverá haver uma tabela ou view com a seguinte estrutura:</p>
<p>- uma coluna contendo o login;</p>
<p>- uma coluna contendo a role;</p>
<p>Para o exemplo, vamos chamar esta tabela de tabela_roles.</p>
<p>Deverá também haver uma outra tabela ou view com:</p>
<p>- uma coluna contendo o login;</p>
<p>- uma coluna contendo a senha;</p>
<p>Esta tabela será a tabela_usuarios.</p>
<p>A partir desta estrutura, é possível utilizar o JAAS com banco de dados, configurando o arquivo context.xml, incluindo a seguinte tag:</p>
<pre class="brush: xml; title: ; notranslate">

&lt;Realm className=&quot;org.apache.catalina.realm.JDBCRealm&quot; debug=&quot;99&quot;
driverName=&quot;nome_do_driver&quot;
connectionURL=&quot;jdbc:url_da_conexao?user=user_banco&amp;amp;password=senha_banco&quot;
userTable=&quot;tabela_usuarios&quot;
userNameCol=&quot;nome_coluna_login&quot;
userCredCol=&quot;nome_coluna_senha&quot;
userRoleTable=&quot;tabela_roles&quot;
roleNameCol=&quot;nome_coluna_role&quot;/&gt;
</pre>
<p>Um ponto importante é que a coluna de login deverá ter o mesmo nome, nas duas tabelas.</p>
<p>Espero ter ajudado.</p>
<p>Abraço!</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.hallanmedeiros.com/2010/05/26/jaas-como-utilizar-com-banco-de-dados/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Documentação de Casos de Uso</title>
		<link>http://blog.hallanmedeiros.com/2010/03/29/documentacao-de-casos-de-uso/</link>
		<comments>http://blog.hallanmedeiros.com/2010/03/29/documentacao-de-casos-de-uso/#comments</comments>
		<pubDate>Mon, 29 Mar 2010 19:50:18 +0000</pubDate>
		<dc:creator>Hallan</dc:creator>
				<category><![CDATA[Engenharia de Software]]></category>
		<category><![CDATA[Requisitos]]></category>
		<category><![CDATA[Softwares]]></category>

		<guid isPermaLink="false">http://blog.hallanmedeiros.com/?p=245</guid>
		<description><![CDATA[Com respeito a documentação de casos de uso, muitos tem dúvidas de como fazer ou até mesmo o que escrever. Neste post, irei mostrar algumas dicas e um link interessante sobre como documentar um caso de uso. Para documentar um &#8230;<p class="read-more"><a href="http://blog.hallanmedeiros.com/2010/03/29/documentacao-de-casos-de-uso/">Continue lendo &#187;</a></p>]]></description>
			<content:encoded><![CDATA[<p>Com respeito a documentação de casos de uso, muitos tem dúvidas de como fazer ou até mesmo o que escrever. Neste post, irei mostrar algumas dicas e um link interessante sobre como documentar um caso de uso.<br />
<span id="more-245"></span><br />
Para documentar um caso de uso, as informações básicas sâo:</p>
<ul>
<li>Número e Nome do caso de uso</li>
<li>Descrição</li>
<li>Atores envolvidos</li>
<li>Pré-condição</li>
<li>Pós-condição</li>
<li>Fluxo de tarefas</li>
</ul>
<p><span style="text-decoration: underline;"><strong>Número e Nome do caso de uso</strong></span><br />
Serve para identificar o caso de uso. Normalmente, adotam-se padrões como CSU ou UC como siglas. Exemplo: UC 01 &#8211; Manter Usuário</p>
<p>
<span style="text-decoration: underline;"><strong>Descrição</strong></span><br />
Descreve a função e o resultado final de um Caso de Uso., sem detalhar muito. Exemplo: &#8220;Este caso de uso serve para cadastrar um novo usuário&#8221;.</p>
<p>
<span style="text-decoration: underline;"><strong>Atores envolvidos</strong></span><br />
O ator é quem interage com o sistema, iniciando o caso de uso. Exemplo: Administrador do Sistema.</p>
<p>
<span style="text-decoration: underline;"><strong>Pré-condição</strong></span><br />
Condições que precisam ser verdadeiras no início do caso de uso. Uma pré-condição não atendida impede o início do caso de uso.<br />
Exemplo: &#8220;O usuário deve estar logado no sistema&#8221;.</p>
<p>
<span style="text-decoration: underline;"><strong>Pós-condição</strong></span><br />
Condições que precisam ser verdadeiras no final do caso de uso. Pode ser um outro caso de uso.<br />
Exemplo: &#8220;Após o fim do caso de uso, o sistema deve enviar um e-mail ao administrador informando o ocorrido&#8221;.</p>
<p>
<span style="text-decoration: underline;"><strong>Fluxo de Tarefas</strong></span><br />
Descreve a sequência em que as ações devem ser executadas.<br />
Podem haver fluxos de tarefas principal, alternativo e exceção.<br />
Exemplo:</p>
<ol>
<li>O usuário clica no botão &#8220;Cadastrar&#8221;</li>
<li>O sistema mostra os dados para cadastro</li>
<li>O usuário preenche os dados de cadastro</li>
<li>O usuário clica no botão &#8220;Cadastrar&#8221;</li>
<li>O caso de uso é finalizado.</li>
</ol>
<p>Uma apresentação muito interessante e bem completa sobre casos de uso pode ser visualizada logo abaixo:</p>
<div style="width: 425px;"><strong style="display:block;margin:12px 0 4px"><a title="Análise Orientada a Objetos - Casos de Uso" href="http://www.slideshare.net/CursoSENAC/anlise-orientada-a-objetos-casos-de-uso">Análise Orientada a Objetos &#8211; Casos de Uso</a></strong><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="425" height="355" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowFullScreen" value="true" /><param name="allowScriptAccess" value="always" /><param name="src" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=anlise-orientada-a-objetos-casos-de-uso-1217200098860168-9&amp;rel=0&amp;stripped_title=anlise-orientada-a-objetos-casos-de-uso" /><param name="allowfullscreen" value="true" /><embed type="application/x-shockwave-flash" width="425" height="355" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=anlise-orientada-a-objetos-casos-de-uso-1217200098860168-9&amp;rel=0&amp;stripped_title=anlise-orientada-a-objetos-casos-de-uso" allowscriptaccess="always" allowfullscreen="true"></embed></object></div>
<p>
Espero ter ajudado.<br />
Abraço,<br /></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.hallanmedeiros.com/2010/03/29/documentacao-de-casos-de-uso/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Flex: Style Explorer</title>
		<link>http://blog.hallanmedeiros.com/2010/03/15/flex-style-explorer/</link>
		<comments>http://blog.hallanmedeiros.com/2010/03/15/flex-style-explorer/#comments</comments>
		<pubDate>Tue, 16 Mar 2010 01:51:25 +0000</pubDate>
		<dc:creator>Hallan</dc:creator>
				<category><![CDATA[Dicas]]></category>
		<category><![CDATA[Flex]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[ActionScript]]></category>

		<guid isPermaLink="false">http://blog.hallanmedeiros.com/?p=243</guid>
		<description><![CDATA[Bom, decidi criar este post pois muita gente desconhece o Flex Style Explorer, do site da Adobe. Muito bom, pois o usuário seleciona visualmente como quer deixar sua aplicação e o site gera o CSS de acordo com as escolhas. &#8230;<p class="read-more"><a href="http://blog.hallanmedeiros.com/2010/03/15/flex-style-explorer/">Continue lendo &#187;</a></p>]]></description>
			<content:encoded><![CDATA[<p>Bom, decidi criar este post pois muita gente desconhece o Flex Style Explorer, do site da Adobe. Muito bom, pois o usuário seleciona visualmente como quer deixar sua aplicação e o site gera o CSS de acordo com as escolhas. Realmente vale a pena dar uma olhada.</p>
<p>Link: <a href="http://examples.adobe.com/flex3/consulting/styleexplorer/Flex3StyleExplorer.html" target="_blank">FlexStyle Explorer</a></p>
<p>Abraço!</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.hallanmedeiros.com/2010/03/15/flex-style-explorer/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

