10 Oct
Hoje eu estou começando um novo projeto. Nada mais é do que um simples tracker de tarefas (uma todo-list com um pouquinho mais de recursos) escrito em Rails. Estou fazendo isso porque tenho tido várias idéias sobre projetos, mas acabo esquecendo porque não tenho um bom lugar para guardá-las (acabam em uma folha no meio de algum caderno que eu nunca lembro onde está).
Isso é muito ruim. De repente posso ter esquecido a idéia que seria o próximo YouTube (acho que não…). De qualquer forma, organização é uma necessidade para qualquer projeto, por menor que seja.
Então este pequeno projeto também deve ser bem organizado. Gastei uns 15 minutos pensando o que eu precisaria fazer e já comecei a me perder. Resolvi entãoi aproveitar o que eu aprendi sobre XP no meu estágio e aplicar isso nesse projetinho.
Uma das coisas que eu mais gostei de XP foi da lousa. Nunca pensei que uma combinação de lousa com post-its pudesse ser tão produtiva. Mas foi aí que me surgiu um problema. Eu tinha post-its, cartões, canetas mas nenhuma lousa. Se eu saísse para comprar iria perder várias horas (duvido que eu fosse encontrar um lousa aqui em Ribeirão Pires). Bom, o que não se resolve permanentemente a gente resolve temporáriamente.
Esse é o resultado:

Minha janela do quarto está cumprindo muito bem o papel de lousa. O único problema é que era difícil de ver o que estava escrito. Então coloquei algumas folhas de papel atrás.
Pois é… acho que não tem nada que um pouco de criatividade não resolva. Alguém mais já encontrou alguma solução estranha como essa?
Posts Relacionados:
7 Oct
Quando estudamos estruturas de dados, aprendemos que um Hash, no caso médio (ou no caso de um hashing perfeito) é mais rápido (possui menor complexidade) que uma árvore balanceada, como a árvore Rubro-Negra. A teoria nos prova isso. E na prática?
Rodei o seguinte programa para comparar os dois:
package net.vidageek.benchmark;
import java.util.HashSet;
import java.util.Set;
import java.util.TreeSet;
public class DumbHashTreeBenchmark {
private static final int INCREMENTO = 500000;
private static final int MAX_BEFORE_CRASH = 2000001;
public static void main(String[] args) {
for (int i = 0; i < MAX_BEFORE_CRASH; i += INCREMENTO) {
Set hash = new HashSet();
Set tree = new TreeSet();
System.out.println("Teste: n = " + i + " Tempo Hash: "
+ popula(hash, i) + " Tempo Árvore: " + popula(tree, i));
}
}
private static long popula(Set set, int n) {
long inicio, fim;
inicio = System.currentTimeMillis();
for (int i = 0; i < n; i++)
set.add(i);
fim = System.currentTimeMillis();
return fim - inicio;
}
}
O resultado disso parece bem estranho (o tempo está em milisegundos):
| Benchmark | ||
|---|---|---|
| Itens inseridos | HashSet | TreeSet |
| 0 | 0 | 0 |
| 5×105 | 808 | 598 |
| 10×105 | 1102 | 797 |
| 15×105 | 2087 | 2381 |
| 20×105 | 1676 | 5439 |
Porque que nos dois primeiros testes o TreeSet foi mais eficiente que o HashSet? Em teoria o HashSet deveria ser mais rápido, não é? Não.
Usar um Hash é muito eficiente sob certas condições:
Embora eu não tenha visto a implementação da função de hashing, tenho certeza de que ela é boa. Uma empresa do tamanho da Sun não arriscaria o nome com algo tão besta. Então o problema só pode ser a tabela de hashing.
Como não disse qual deveria ser o tamanho da tabela, ela foi criada com o valor padrão (16). Como eu tentei inserir uma quantidade muito superior ao tamanho da tabela, ela teve que ficar sendo realocada. Essa operação chama-se re-hashing e é possui custo muito alto, porque envolve alocação de uma nova tabela maior que a anterior e cálculo da função de hashing de todos os elementos dentro dela. Basicamente um novo HashSet é contruído a cada vez que a tabela fica com itens demais. O tempo que é perdido com essa operação da uma vantagem bem grande para o TreeSet que acaba tendo um desempenho melhor por falha do programador. Para mostrar isso fiz uma pequena modificação no main do programa anterior:
public static void main(String[] args) {
for (int i = 0; i < MAX_BEFORE_CRASH; i += INCREMENTO) {
Set hash = new HashSet(2*MAX_BEFORE_CRASH);
Set tree = new TreeSet();
System.out.println("Teste: n = " + i + " Tempo Hash: "
+ popula(hash, i) + " Tempo Árvore: " + popula(tree, i));
}
}
Vejam a diferença assustadora dos resultados:
| Benchmark | ||
|---|---|---|
| Items inseridos | HashSet | TreeSet |
| 0 | 0 | 0 |
| 5×105 | 744 | 972 |
| 10×105 | 536 | 1365 |
| 15×105 | 979 | 3660 |
| 20×105 | 1730 | 4077 |
Ainda daria pra fazer o HashSet se comportar de forma mais rápida, movendo a criação dele para fora do laço e esvaziando ele no fim de cada iteração.
Em uma máquina com menos disponibilidade de mémoria (a que eu usei para o teste possui 2GB) se um HashSet for usado como da primeira maneira, ele será muito pior que o TreeSet. Por isso é muito importante saber sob quais condições uma estrutura de dados é melhor do que outra.
Posts Relacionados:
23 Sep
Já não é novidade pra ninguém que o mundo está sendo tomado pelos processadores com 64 bits. Qualquer micro novo que você compre vem com um processador dual core 64 bits. Mas, como ainda estamos em processo de migração dos 32 para os 64 bits, vários problemas acontecem.
Um dos problemas estou enfrentando agora. O site Banco do Brasil faz autenticação usando uma applet Java. Isso significa que eu preciso ter suporte a java no meu browser (Firefox). Simples:
sudo apt-get install java6-sun-plugin
O que acontece? O apt-get diz que não encontra o pacote , embora exista uma referência de um outro pacote a ele.
Procurando por algum tempo no Google, encontro um site que diz que você precisa acrescentar multiverse ao main do feisty no sources.list. Por acaso já tinha feito isso.
Depois de muito procurar usando o apt-cache (o Google não estava ajudando muito…), encontrei um plugin java 1.4 para o firefox. Pensei: “Melhor que nada. Quem sabe funciona”. Depois de baixar a jre 1.4 (inútil pois estou usando java 6 na máquina), instalar o plugin (j2re1.4-mozilla-plugin), entrei novamente no Banco do Brasil, a applet carregou e… o firefox foi morto por uma NullPointerException causada pelo plugin no momento em que eu passei o mouse em cima da applet.
Triste fim para uma tarde. Mas faz parte do processo de mudança. Até processadores de 64 bits tornarem-se padrão para a produção de software, usuários de linux 64 bits vão sofrer bastante.
Posts Relacionados:
13 Sep
Agora que você já tem o compilador de Tex e o pré-processador de Latex instalados na sua máquina, vamos dar as ferramentas necessárias para escrever documentos simples em Latex, porém já bonitos.
Antes de começar a escrever seu documento, é necessário informar qual é tipo de documento você vai escrever: um artigo, um livro ou um relatório.
Esses tipos definem vários atributos estilísticos como tamanho da letra, área útil do papel, frente e verso ou só frente, número de colunas, etc… Escolha o que melhor se aplica à sua necessidade e modifique algum desses atributos, se preciso, acrescentando a opção entre colchetes.
As diferenças principais nos atributos de cada um dos tipos de documento em Latex são duas:
| Atributo | article | book | report |
| Impressão | só frente | frente e verso | só frente |
| Capa | Inclusa na primeira página do texto |
Página de capa | Página de capa |
Agora que já definimos a formatação básica da página, temos que importar alguns pacotes que nos permitem escrever em português. O suporte à grafia brasileira, incluindo acentos e tudo o mais, é dado por um conjunto de pacotes:
Alternativamente a usar estes pacotes, você pode escrever manualmente os acentos e o cedilha utilizando a sintaxe de Tex:
| ~ (til) | ‘ (agudo) | ^ (circunflexo) | ` (grave)<\td> | |
| a | \~a ou \~{a} | \’a ou \’{a} | \^a ou \^{a} | \`a ou \`{a} |
| e | — | \’e ou \’{e} | \^e ou \^{e} | — |
| i | — | \’i ou \’{i} | \^i ou \^{i} | — |
| o | \~o ou \~{o} | \’o ou \’{o} | \^o ou \^{o} | — |
| a | — | \’u ou \’{u} | \^u ou \^{u} | — |
E o cedilha, escrevemos assim: \c{c}.
Você pode informar o Título e o Autor do seu texto no código de forma a, sempre que você precisar dessas informações, você pode acessar diretamente usando os comandos \title e \author. Além disso, quando você quiser que seu texto tenha uma capa, basta usar o comando \maketitle e um bloco com nome do texto e autor aparecerão, já centralizados e com tamanhos de letra adequados.
Os comandos são usados da forma mais intuitiva:
\title{Nome do Texto}
\author{Cecilia \\ VidaGeek.net}
Então, até agora sabemos usar o cabeçalho e o que significa o que você escreve nele:
\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage[latin1]{inputenc}
\usepackage[brazil]{babel}
\title{Guia Latex II - O Básico}
\author{VidaGeek}
\begin{document}
Tente escrever texto aqui!
\end{document}
Posts Relacionados: