Wikipédia no terminal do Linux

Tem louco pra tudo. É possível ver trechos de artigos da Wikipedia através de um lookup DNS em um servidor criado por David Leadbeater. Por exemplo, para ler um trecho do artigo sobre Linux, digite o comando abaixo no terminal:

fonini@valhalla:$ dig +short txt Linux.wp.dg.cx

Se você não tiver o dig pode fazer a consulta através do host:

fonini@valhalla:$ host -t txt Linux.wp.dg.cx

Claro que isso não possui muita utilidade, pois somente são retornados 430 bytes. Outro problema é que, para consultas como por exemplo Power Metal, você deve inserir um underline entre as palavras, como é feito na Wikipédia.

Você também pode fazer um alias através do seguinte comando:

fonini@valhalla:$ wiki() { dig +short txt $1.wp.dg.cx; }

E procurar da seguinte maneira:

fonini@valhalla:$ wiki Power_metal

Abraço e até a próxima!

Tutorial de programação com Brainfuck

Brainfuck é uma linguagem de programação esotérica, praticamente sem fins práticos, criada em 1993. Extremamente minimalista, possui apenas 8 comandos, com os quais é possível fazer inúmeras coisas. Não se deixe enganar pela sintaxe complicada e baixo número de comandos, esta linguagem é capaz de resolver qualquer problema computável. É uma excelente linguagem para treinar a sua lógica e, é claro, fazer jus ao nome da linguagem.

Comandos

. Imprime o caractere ASCII refente ao valor inteiro da célula atual
, Armazena o valor da próxima tecla a ser pressionada na célula atual
+ Incrementa em 1 o valor da célula atual
- Decrementa em 1 o valor da célula atual
> Avança o ponteiro para a próxima célula
< Retrocede o ponteiro para a célula anterior
[ Executa os comandos enquanto o valor da célula atual não for 0
] Fim do bloco de repetição


Compiladores

Existem diversos compiladores para a linguagem, inclusive existe um nos repositórios do Ubuntu, o bf. Eu optei por compilar a versão em Assembly disponível aqui. Após escrever o seu código-fonte, o compilador criará um executável binário.


Codificando

O brainfuck trabalha com células de memória, ou seja, cada caracter que você usar deverá estar armazenado em uma célula (ou não, no caso de usar sempre a mesma célula, mostrar o valor e sobrescrever, como eu faço no exemplo abaixo). Suponha que você queira mostrar a letra “j” em brainfuck. Você deverá armazenar 106 na célula (digitando 106 sinais de + ou criando um laço de repetição), que é o valor equivalente a “j” em ASCII. O código abaixo escreve “jonnas” na tela:

	+++++++++++ Posição 1 recebe 11 e será a controladora do laço abaixo
Enquanto o valor da primeira posição for maior que 0 [ - Decrementa o valor da posição 1 > Avança para a posição 2 +++++++++++ Posição 2 recebe 11 < Volta para a posição 1 ] > Avança novamente para a posição 2 --------------- . Decrementa 15 e imprime +++++ . Incrementa 5 e imprime - . Decrementa 1 e imprime . Apenas imprime novamente ------------- . Decrementa 13 e imprime ++++++++++++++++++ . Incrementa 18 e imprime

Apesar de parecer complicado, o processo é simples. A primeira linha armazena 11 na célula 1, que será o número de vezes que o loop executará. Enquanto a posição 1 não for 0, decrementamos a posição 1, avançamos para a posição 2, incrementamos seu valor em 11 e voltamos para a posição 1. Ao final do loop, o valor da posição 1 será 0 e da posição 2 será 121.
Como o valor da letra “j” em ASCII é 106, decrementamos 15 da posição 2 e mostramos. Para mostrar a letra “o”, cujo valor é 111, devemos incrementar 5 na posição 2 e mostrar e assim sucessivamente até mostrar o nome inteiro. Veja abaixo uma versão do código sem comentários:

+++++++++++
[
	-
	>
	+++++++++++
	<
]
>
--------------- .
+++++ .
- .
.
------------- .
++++++++++++++++++ .

A versão do código em uma única linha é essa:

+++++++++++[->+++++++++++<]>---------------.+++++.-..-------------.++++++++++++++++++.

Partindo daí, pode-se resolver inúmeros problemas em brainfuck e aprimorar a lógica cada vez mais.

Abraço e até a próxima!

Method Chaining com PHP

Method Chaining (encadeamento de métodos) é uma técnica de programação que permite reduzir o tamanho de seus códigos. Em determinadas classes, você precisa chamar vários métodos diferentes em diversas linhas. Com method chaining, você poderá chamar esses métodos em cadeia, em somente uma linha. Por exemplo, veja a seguinte classe de formatação de strings:

class String{
	private $str;

	public function __construct($str){
		$this->str = $str;
	}
	
	public function toLower(){
		$this->str = strtolower($this->str);
	}
	
	public function capitalize(){
		$this->str = ucfirst($this->str);
	}
	
	public function bold(){
		$this->str = '<strong>'.$this->str.'</strong>';
	}
	
	public function getStr(){
		return $this->str;
	}
}

$string = new String("TEXTO DE EXEMPLO");
$string->toLower();
$string->capitalize();
$string->bold();
echo $string->getStr();

Essa é forma que grande parte dos programadores escrevem seus códigos. Com method chaining, nossa classe ficaria assim:

class String{
	private $str;
	
	public function __construct($str){
		$this->str = $str;
	}
	
	public function toLower(){
		$this->str = strtolower($this->str);
		return $this;
	}
	
	public function capitalize(){
		$this->str = ucfirst($this->str);
		return $this;
	}
	
	public function bold(){
		$this->str = '<strong>'.$this->str.'</strong>';
		return $this;
	}
	
	public function getStr(){
		return $this->str;
	}
}

$string = new String("TEXTO DE EXEMPLO");
echo $string->toLower()->capitalize()->bold()->getStr();
//Retornará <strong>Texto de exemplo</strong>;

Bem mais simples, não? A diferença da outra classe, é que você retorna a instância do objeto a cada método chamado, permitindo o encadeamento.

Bom, como você pode ver, essa classe praticamente não tem muita utilidade, mas permite ter uma boa visão de como funciona a técnica. Agora é com você.

Abraço e até a próxima!

Tutorial de Hibernate com SQLite

Comecei a trabalhar com Java há um mês, usando o framework Hibernate. O Hibernate é uma camada de persistência que pode parecer confusa no início, mas proporciona uma grande produtividade, uma vez que gerencia todo o processo de comunicação com o banco de dados, desde criação e atualização de tabelas, até chaves estrangeiras.

O NetBeans 6.8 é uma IDE que facilita muito o processo de criação, pois já vem com o Hibernate incluso. Vale lembrar que é sempre bom saber fazer o trabalho de forma braçal, para conhecer o lugar onde você está se metendo. Resolvi usar SQLite para alguns testes com o Hibernate e estou disponibilizando um exemplo básico do processo, usando o NetBeans. Let’s work!

Abra o NetBeans, clique em Arquivo/Novo projeto, selecione Java/Aplicativo Java e escolha um nome para seu projeto. No meu caso ficou TesteHibernate e finalize.

O próximo passo é incluir a biblioteca do Hibernate no projeto. Na aba Projetos, clique com o botão direito em Bibliotecas/Adicionar biblioteca e selecione o Hibernate JPA. Para trabalhar com o SQlite você deve incluir também o driver JDBC do mesmo do projeto. Baixe-o aqui caso você não tenha. Após baixado, crie uma pasta chamada lib na pasta do projeto. Você pode adicionar todas as bibliotecas externas nessa pasta para facilitar a organização. Após colocar o driver na pasta, adicione-o ao projeto clicando novamente na aba Projetos/Bibliotecas/Adicionar JAR/Pasta e selecione o driver.

Agora que já temos o Hibernate e o driver do SQLite incluídos, vamos criar a conexão com o banco de dados. Clique na aba Serviços/Banco de Dados/Drivers. Se o driver do SQLite não estiver aparecendo, clique com o botão direito em Drivers/Novo driver. Em Arquivos do driver, adicione o driver da pasta lib e clique em Localizar. Deverá aparecer “org.sqlite.JDBC” no campo Classe do Driver. Dê o nome SQLite ao driver e clique em OK.

Adicionando o driver do SQLite

Agora clique em Drivers/SQLite/Conectar utilizando.
Escolha um nome de usuário, uma senha e a seguinte URL JDBC: jdbc:sqlite:teste.db. O banco estará no arquivo “teste.db” na pasta raíz do projeto.

Conectando a um banco SQLite

O próximo passo será criar a unidade de persistência do projeto. Clique em Arquivo/Novo arquivo/Persistence/Unidade de persistência. Em biblioteca de persistência, selecione o Hibernate, selecione sua conexão criada anteriormente e selecione a estratégia Criar e finalize.

Criando uma unidade de persistência

O SQLite exige um dialeto SQL específico, que não vem incluído no Hibernate. Eu encontrei um no seguinte endereço: http://hibernate-sqlite.googlecode.com. Você pode baixar somente a classe necessária, clicando aqui. Extraia para a pasta “src” do projeto, ficando assim: “src/util/SQLiteDialect.java”. Com a camada de persistência aberta no NetBeans (persistence.xml), clique em XML e adicione a linha do dialeto do SQLite, como mostrado abaixo:

<property name="hibernate.dialect" value="util.SQLiteDialect" />

A camada de persistência está pronta. Vamos a criação do model.

Clique em Arquivo/Novo arquivo/Java/Classe Java e dê o nome Pessoa para a classe. O código está abaixo. Não entrarei em detalhes com as anotações utilizadas, quem sabe isso fica para um próximo post.

package net.fonini.testehibernate;
	
import java.io.Serializable;
import java.util.Date;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.SequenceGenerator;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;

/**
* @author fonini
*/

@Entity
public class Pessoa implements Serializable {
	@Id
	@SequenceGenerator(name="seqPessoa")
	@GeneratedValue(generator="seqPessoa")
	private Integer id;
	
	@Column(length=50, nullable=false)
	private String nome;
	
	@Temporal(TemporalType.DATE)
	private Date aniversario;
	
	public Pessoa(){
	}
	
	public Date getAniversario() {
		return this.aniversario;
	}
	
	public void setAniversario(Date aniversario) {
		this.aniversario = aniversario;
	}
	
	public Integer getId() {
		return this.id;
	}
	
	public void setId(Integer id) {
		this.id = id;
	}
	
	public String getNome() {
		return this.nome;
	}
	
	public void setNome(String nome) {
		this.nome = nome;
	}
}	

Agora que temos nossa classe, vamos adicioná-la a unidade de persistência. Abra a unidade de persistência, e em “Incluir classes de entidade” clique em Adicionar e selecione a classe Pessoa. Se a classe não aparecer na listagem, verifique se as anotações estão corretas.

O próximo passo é criar uma classe de testes do JUnit para usá-la. Clique em Arquivo/Novo arquivo/Classe Java com o nome Teste e muda a localização para Pacotes de Testes. A classe irá possuir dois métodos: um deles persistirá 3 objetos Pessoa e o outro fará a listagem dos mesmos.

package net.fonini.testehibernate;

import java.util.Collection;
import java.util.Date;
import javax.persistence.EntityManager;
import javax.persistence.Persistence;
import org.junit.Test;

/**
	* @author fonini
*/
public class Teste {
	private EntityManager em;

	public Teste(){
		this.em = Persistence.createEntityManagerFactory("TesteHibernatePU").createEntityManager();
	}
	
	@Test
	public void inserir(){
	// Instanciamos um objeto Pessoa, setando nome e data de nascimento
		Pessoa p1 = new Pessoa();
		p1.setNome("Jonnas Fonini");
		p1.setAniversario(new Date());
	
		Pessoa p2 = new Pessoa();
		p2.setNome("Luana Fonini");
		p2.setAniversario(new Date());
	
		Pessoa p3 = new Pessoa();
		p3.setNome("Fulano de Tal");
		p3.setAniversario(new Date());
	
		// Iniciamos a transação
		em.getTransaction().begin();
		// Aqui persistimos os objetos recém criados
		em.persist(p1);
		em.persist(p2);
		em.persist(p3);
		// E aqui efetuamos definitivamente a transação
		em.getTransaction().commit();
	}
	
	@Test
	public void listar(){
		Collection <Pessoa> lista = em.createQuery("from Pessoa").getResultList();

		for (Pessoa p : lista){
			System.out.println(p.getId() + " - " + p.getNome() + " - " + p.getAniversario());
		}
	}
}

Execute os testes pressionando SHIFT+F6 e veja os resultados. Se os testes atingirem 100%, está tudo certo. Senão, procure a possível causa nas exceções. Se você usa um sistema Unix-like, verifique se a pasta raíz do projeto está com as permissões adequadas para a criação do banco de dados. Note que mesmo com os testes atingindo 100% de sucesso, ainda ocorreu uma exceção. Isso se deve ao fato do SQLite não possuir chave estrangeira.

Você pode baixar o projeto completo, com todas as bibliotecas necessárias incluídas.

Esse foi um tutorial bem básico, apesar de longo. Agora é com você. Bom estudos.
Abraço e até a próxima!