Dann Luciano

A lifelong student of the art of programming computers!

Amor Pelo Que Se Faz

| Comments

Hoje pela manha li um artigo [1] muito intrigante e que fez minha cabeça ferver de pensamentos. O nome do artigo se chama “Americano ganha a vida como apontador de lápis profissional” e descreve um americano que é especialista em apontar lápis[2]. David Rees chega a cobrar US$ 40 e pode levar até 45 minutos por lápis apontado e já escreveu dois livros sobre o assunto [3].

Como pode uma pessoa ganhar a vida apontando lápis? Quem são os “fúteis” que financiam uma ideia dessa?

Uma das coisas que mais sou apaixonado pelos americanos é exatamente esse lado fútil deles. É simplesmente magico ver que uma pessoa extremamente apaixonada pelo que faz consegue ganhar a vida mesmo com uma tarefa que na minha opinião é tão simples e banal. Por mais que uma lapiseira não aponte um lápis da melhor forma possível, ela ainda sim o aponta. Com o valor cobrado para apontar um lápis daria para comprar vários outros lápis.

Mesmo assim os americanos possuem essa sensibilidade de enxergar esse amor e simplesmente compram esse trabalho que mais se parece com uma obra de arte. Como eu gostaria que nós brasileiros tivéssemos um pouquinho só dessa sensibilidade.

  1. Americano ganha vida como apontador de lápis profissional
  2. Artisanal Pencil Sharpening
  3. How Sharpen Pencils Theoretical Contractors

A Cabeça De Steve Jobs

| Comments

Hoje de madrugada terminei de ler a tradução do livro A Cabeça de Steve Jobs (Inside Steve’s Brain) escrito por Leander Kahney, e traduzido por Maria Helena Lyra e Calor Irineu da Costa. O trabalho dos tradutores em especial foi excelente. O livro não é novo e na época de sua escrita Steve Jobs ainda estava vivo. Como tinha visto ótimos comentários sobre esse livro, decidi ler primeiro ele e depois a biografia oficial, que pretendo iniciar depois da publicação deste post.

Aos que não gostam da Apple deveriam ao menos dar uma chance as ideias do Tio Jobs. Muitas das maravilhas tecnológicas existentes hoje tem alguma relação com ele.

Durante a leitura varias frases ficaram na minha cabeça. Olhando os fatos já acontecidos é muito fácil deduzir os acontecimentos. Por exemplo é lógico que o iPod iria ser um sucesso. Mas na época dos acontecimentos as ideias sé eram tão lógicas assim para um grupo pequeno de pessoas. É impressionante como a Apple recebe criticas e mais criticas (negativas na maioria das vezes) sobre os novos lançamentos e na mesma razão das criticas vem o sucesso.

No final de cada capitulo o escritor deixa varias das lições (segundo o próprio escritor) que Steve Jobs deixou para o mundo. Muitas delas é assimiladas facilmente com ideias de metodologias ágeis, startups, empreendedorismo. Outras delas são extremamente bobas e simples de seguir, mas infelizmente poucos são os que tem disciplina para executadas.

Deixo aqui as lições de Steve Jobs contidas no livro, mas sem explica-las:

  • Foco
    • Trabalhe
    • Encare as decisões difíceis
    • Não se deixe levar pelas emoções
    • Seja firme
    • Busque informação; não faça suposições
    • Busque Ajuda
    • Foco significa dizer “não”
    • Mantenha o foco
    • Concentre-se naquilo em que você é bom
  • Despotismo
    • Seja um déspota
    • Gere alternativas e escolha a melhor
    • Crie os projeto pixel a pixel
    • Simplifique
    • Não tenha medo de começar do zero
    • Evite o efeito Osborne
    • Não cuspa no prato em que come
    • Quando se trata de ideias, qualquer coisa vale
    • Encontre uma maneira fácil de apresentar novas ideias
    • Não ouça seus compradores
  • Perfeccionismo
    • Não faça concessões
    • Desing é função e não forma
    • Troque ideias
    • Inclua todo mundo
    • Evite um processo sequencial
    • Gere e Teste
    • Não force
    • Respeite os materiais
  • Elitismo
    • Só estabeleça parcerias com atores nota 10 e demita os idiotas
    • Busque a mais alta qualidade
    • Invista em pessoas
    • Trabalhe em equipes pequenas
    • Não dê ouvidos aos que só dizem “sim”
    • Trave combates intelectuais
    • Dê total liberdade a seus parceiros
  • Paixão
    • Ser um idiota não tem importância, contanto que você tenha paixão pela coisa
    • Descubra uma paixão pelo seu trabalho
    • Use o método de recompensa e punição para obter um excelente trabalho
    • Dê um chute nos traseiros para fazer as coisas andarem
    • Celebre as realizações com bom gosto e percepção
    • Insista em coisas que são aparentemente impossíveis
    • Torne-se um grande intimidador
    • Seja um grande sedutor assim como um grande intimidador
    • Force as pessoas a trabalhar duro
  • Espirito inventivo
    • Não perca o consumidor de vista
    • Estude o mercado e o setor
    • Não pense conscientemente sobre inovação
    • Concentre-se nos produtos
    • Lembre-se de que os motivos fazem diferença
    • Roube
    • Conecte
    • Estude
    • Seja flexível
    • Queime os navios
    • Faça prototipos
    • Pergunte aos clientes
  • Estudo de caso
    • Se você perder o barco, trabalhe duro para recuperar o terreno perdido
    • Busque oportunidades
    • Procure por “vetores que se propagam no tempo”
    • Defina um prazo
    • Não se preocupe com a origem da tecnologia
    • Aproveite sua expertise
    • Acredite no seu processo
    • Não tenha medo do processo de tentativa de erro
    • Faça as coisas em equipe

O principal motivador da escrita desse review foi exatamente ter a possibilidade de encontrar essas informações rapidamente no futuro, sem ter que ir cata-las no livro. Espero que ajude mais alguém.

Safe C++

| Comments

Recentemente terminei de ler o livro Safe C++: How to Avoid Common Mistakes do Vladimir Kushnir e publicado pela O’Reilly. Recomendo a leitura do livro, pois alguns erros bobos que cometemos no dia-a-dia são facilmente solucionados com soluções simples (minhas preferidas). Uma das frases que mais gostei do autor foi a de que os compiladores são nossos amigos e não o contrario (o clang então). Vou traduzir a estrutura do livro e expor as recomendações do autor.

O repositório com códigos com as dicas do livro estão no Github do Vladimir

Parte I. Estrategia de Caça aos Bugs para C++

  • Capitulo 01: De Onde Vem os Bugs em C++

  • Capitulo 02: Como Capiturar um Bug

    Para diagnostico de erros em tempo de compilação:

    • Use explict antes de construtores com um único argumento. Isto evita conversões não desejadas dos operandos.
    • Use classes diferentes para representar diferentes tipos de dados.
    • Use enums para criar novos tipos de dados e não constantes inteiras.

Parte II. Caça aos Bugs: Um bug de cada vez

  • Capitulo 03: O Que Fazer Quando Encontrar um Erro em Tempo de Execução

  • Capitulo 04: Índice Fora dos Limites

    Para evitar erros de “index out of bounds”:

    • Não use arrays alocados staticamente ou dinamicamente. Use os templates da STL vector ou array.
    • Não use os operadores new[] ou delete[]. Use os conteiner vector para alocar multiplos elementos.
    • Use scpp::array ou scpp::vector, pois eles possuem algumas verificações interessantes (sanity checks).
  • Capitulo 05: Aritmética de Ponteiros

    Evite aritmética de ponteiros. Use os templates vector ou array com os índices.

  • Capitulo 06: Ponteiros, Referencias ou Iteradores Inválidos

    Para evitar erros com ponteiros, referencias ou iteradores inválidos:

    • Não use ponteiros, referencias ou iteradores depois de modificar um conteiner.
  • Capitulo 07: Variáveis Não Inicializadas

    Para evitar erros de variáveis não inicializadas especialmente membros de classes:

    • Não use os tipos primitivos como int, unsigned, double, bool em membros de classes. Em vez disso use Int, Unsigned, Double, Bool, porque você não vai precisar inicializalos. (Eu particularmente ainda acredito que isso deixa nosso código mais orientado a objeto).
    • Use as novas classes em vez dos tipos primitivos na passagem de parâmetros para funções ou métodos para conseguir adicionalmente tipos corretos.
  • Capitulo 08: Perdas de Memórias

    Para evitar vazamentos de memória:

    • Toda vez que criar um objeto usando o operador new, imediatamente atribua o resultado a um smart pointer (reference counting ou scoped).
    • Use o operador new sempre sem os colchetes([]). Se precisar criar um array, crie um novo template vector, que é um único objeto.
  • Capitulo 09: Des-referenciando um Ponteiro Nulo

    Para capturar tentativas de des-referenciar um ponteiro nulo:

    • Se você tiver um ponteiro que é proprietário do objeto que ele aponta, use um smart pointer (reference counting ou scoped)
    • Quando você tiver um ponteiro puro(raw) T* apontando para um objeto que não o pertence, use o template Ptr<T>.
    • Para ponteiros constantes (const T*) use Ptr<const T>.
  • Capitulo 10: Construtores de Copia e Operadores de Atribuição

    Para evitar erros nos construtores de copia e operadores de atribuição:

    • Quando possível, evite escrever o construtor de copia e o operador de atribuição para sua classe.
    • Se a versão padrão não funcionar para você considere proibir a copia das instancias da sua classe declarando o construtor de copia e operador de atribuição como privado.
  • Capitulo 11: Evite Escrever Código nos Destrutores

    Para evitar perdas de memórias quando uma exceções forem lançadas dentro do construtor:

    • Desenhe sua classe de um modo que os destrutores sejam vazios.
  • Capitulo 12: Como Escrever Operadores de Comparação Consistentes

    Para evitar erros quando escrever operadores de comparação:

    • Escreva uma função CompareTo() e use a macro SCPP_DEFINE_COMPASION_OPERATORS para implementar todos os operadores de comparação.
  • Capitulo 13: Erros Quando se Usa a Biblioteca Padrão do C

    Para evitar vazamentos de buffers e crashes quando usar funcões da Biblioteca Padrão C evite usar a biblioteca padrão de strings (string.h):

    • Alem de não serem seguras e em alguns momentos mais lentas que as classes correspondentes em C++, como a std::string e std::ostringstream.

    • Use as classes do C++ e você evitar um numero possíveis erros como comportamentos não esperados.

Parte III. A Alegria de Caça aos Bugs: a Partir de Testes de Depuração para Produção

  • Capitulo 14: Princípios Gerais de Teste

  • Capitulo 15: Estratégia de Debug nos Erros

  • Capitulo 16: Faça Seu Código Facilmente “Debugavel”

  • Capitulo 17: Conclusões

Instalando GCC 4.7.1 No Mac OS X Mountain Lion

| Comments

Como ja expliquei anteriormente a Apple não disponibiliza mais o GCC no Mac OS X 1.8 ou se preferirem Mountain Lion. Então estou publicando um script para fazer a instalação não só do GCC bem como de suas dependências.

Antes de mais nada é importante você ter o Command Line Tools instalando em seu mac seja pelo .dmg ou pelo Xcode.

Basicamente só atualizei o script para as versões mais novas de cada componente, pois na época o gcc 4.7 ainda era experimental.

(build_gcc2.bash) download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
#! /bin/bash

PREFIX=/usr/local/gcc
BUILD_FOLDER=gcc

if [ $UID -ne 0 ] ; then
    echo "Root Please"
    exit 1
fi

mkdir -p $BUILD_FOLDER

cd $BUILD_FOLDER

echo "Download need files"

wget ftp://ftp.gmplib.org/pub/gmp-5.0.4/gmp-5.0.4.tar.bz2 -c
wget http://www.mpfr.org/mpfr-current/mpfr-3.1.1.tar.bz2 -c
wget http://www.multiprecision.org/mpc/download/mpc-0.9.tar.gz -c
wget ftp://gcc.gnu.org/pub/gcc/releases/gcc-4.7.1/gcc-4.7.1.tar.bz2 -c

echo "Compiling gmp"

tar xfz gmp-5.0.4.tar.bz2
cd gmp*
mkdir build
cd build

../configure --prefix=$PREFIX
make
make check
make install

cd ../../

echo "Compiling mpfr"

tar xfz mpfr-3.1.1.tar.bz2
cd mpfr*
mkdir build
cd build

../configure --prefix=$PREFIX --with-gmp=$PREFIX
make
make install

cd ../../

echo "Compiling mpc"

tar xfz mpc-0.9.tar.gz

cd mpc*
mkdir build
cd build
../configure --prefix=$PREFIX --with-gmp=$PREFIX --with-mpfr=$PREFIX
make
make install

cd ../../

echo "Compiling GCC"

tar xfz gcc-4.7.1.tar.bz2

cd gcc*
mkdir build
cd build
../configure --prefix=$PREFIX --enable-checking=release --with-gmp=$PREFIX --with-mpfr=$PREFIX --with-mpc=$PREFIX
make -j 4
make install


echo "GCC Build Complete in " $PREFIX

cd ../../../

read -p "Erase your build directories (y/n)?"
[ "$REPLY" == "n" ] || rm -rf $BUILD_FOLDER

echo "Please added the lines in .bashrc or .zshrc"
echo "export PATH='$PREFIX/bin:$PATH'"

Para você não ter que executar todos esses passos manualmente aqui vai um atalho:

1
curl http://blog.dannluciano.com.br/downloads/code/build_gcc2.bash | sudo bash

Ao final o script pergunta se você quer remover o diretório onde foi compilados os códigos objetos. Se você não tiver interesse eu quiser um espaço extra é só responder y. Se não remover esse diretório poderá ser usado para futuros updates do GCC tendo a vantagem de não compilar tudo do zero novamente.

Para testar o GCC recém compilado, bastar adicionar a pasta /usr/local/gcc/bin no PATH do seu Terminal e digitar: gcc -v

A saída deve se parecer com isso:

1
2
3
4
5
6
7
8
$ gcc -v
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/local/gcc/libexec/gcc/x86_64-apple-darwin12.0.0/4.7.1/lto-wrapper
Target: x86_64-apple-darwin12.0.0
Configured with: ../configure --prefix=/usr/local/gcc --enable-checking=release --with-gmp=/usr/local/gcc --with-mpfr=/usr/local/gcc --with-mpc=/usr/local/gcc
Thread model: posix
gcc version 4.7.1 (GCC)

O grupo responsável pelo High Performance Computing for Mac OS X também já atualizaram os binários do GCC compilados por eles. Para instalar é só executar a sequencia de passos abaixo.

1
2
3
4
wget http://prdownloads.sourceforge.net/hpc/gcc-mlion.tar.gz?download
gunzip gcc-mlion.tar.gz
sudo tar -xvf gcc-mlion.tar -C /
echo "export PATH=/usr/local/bin:$PATH" >> /etc/profile

Espero ter ajudado alguma alma. Qualquer problema, critica ou sugestão é só comentar ou enviar um email para dannluciano at gmail dot com. Boa sorte.

Rsync Exclude

| Comments

Hoje passei por um problema e gostaria de compartilhar a solução com vocês. Meu mais novo brinquedo chegou e eu queria fazer uns testes de programação nele, usando o Textastic.

O problema:

Meu principal projeto do mestrado esta versionado com o Git. Só que eu gero alguns arquivos “binários” como images, postscripts, logs, gráficos, que uso para documentação e entradas para o meus algoritmos, mas eles alem de ocuparem muito espaço, não fazem sentido serem versionados pelo Git. Uma solução simples é adicionar eles no .gitignore fazendo com que o Git não se preocupe com eles.

O problema real esta na hora de carregar só os arquivos fontes para o iPad, uma solução seria incluir só o diretório src onde estão a maioria dos fontes, mas isso deixaria outros fontes de fora.

A solução:

A solução que encontrei foi usar o Rsync para sincronizar o repositório com uma pasta no Dropbox.

Com a flag --exclude do Rsync podemos fazer isso facilmente para pastas e arquivos individuais, mas passar --exclude para cada diretório ou arquivo é uma tarefa bastante trabalhosa.

Pensando um pouco eu já tinha todos os diretórios e arquivos que não queria versionar no .gitignore, eu só precisava que o Rsync entendesse isto. Pesquisando eu encontrei uma a flag --exclude-from que faz justamente isso e ainda possui a mesma “semântica” do .gitignore. O comando final ficou assim:

Liquid error: undefined method `lstrip’ for #

Este comando juntamente com outros são executados de hora em hora com o cron.

Se alguém tiver uma melhor forma de resolver esse problema, ou duvida, não deixe de comentar.

Referencias:

Imagemagick Convert

| Comments

O Imagemagick é um software para criação, edição ou conversão de arquivos de imagens no terminal. Ele suporta mais de 100 formatos de imagens e operações de redimensionar, rotacionar, cortar dentre outras são muitos simples.

Recentemente precisei converter vários arquivos .eps em .png. Depois de algumas pesquisas descobrir o convert que é um modulo do Imagemagick. Eu simplesmente não consigo imaginar algo mais simples para conversão de imagens que isso:

convert arquivo.eps arquivo.png

Just Works!!

Quick-R

| Comments

O Quick-R é um site em inglês muito simples e intuitivo com um conteúdo excelente para quem já sabe alguma linguagem de programação e estatística mas que gostaria de apender uma ferramenta essencial (a linguagem R) que agrupe estes dois conceitos. Quem quiser conhecer mais é só clicar no link abaixo.

http://www.statmethods.net

ISO646 Ou iso646.h

| Comments

Muitos programadores alegam que linguagens com python ou ruby são mais faceis de entender pois essas linguagens possuem nomes mais apropriados para comandos e etc. Uma vez li em um blog (até sei qual o post, mas Ética é Ética) que em python operações booleanas eram mais compreensíveis, pois usavam nomes mais intuitivos como and or xor ao contrario de && || ^ respectivamente.

Hoje em meus estudos sobre C eis que encontro um cabeçalho (header) chamado iso646.h localizado em /usr/include/. Olhando o seu pequeno conteúdo podemos ver algo parecido com isso:

1
2
3
4
5
6
7
8
9
10
11
#define	and	&&
#define	and_eq	&=
#define	bitand	&
#define	bitor	|
#define	compl	~
#define	not	!
#define	not_eq	!=
#define	or	||
#define	or_eq	|=
#define	xor	^
#define	xor_eq	^=

A dica é muito cuidado com o que você fala, principalmente se você não tem um profundo entendimento do assunto.

Se você conhece alguém que diz que sabe muito sobre C, duvide, pois é impressionante como a cada fim de semana mergulhando nas profundezas da linguagem aprendo mais e mais.

Graças ao @dmitrynix acabei descobrindo que este cabeçalho não existe no Linux. O porque eu não sei, mas este é um bom motivo para lembrar do porque do Linux não ser considerado um ambiente POSIX. Mas se você usa o gcc ou clang ambos disponibilizam o cabeçalho em:

  • GCC /usr/lib/gcc/x86_64-linux-gnu/4.6/include/iso646.h ou
  • clang /usr/include/clang/3.0/include/iso646.h

Não se esqueça que dependendo da instalação os nomes e locais dos arquivos podem mudar.

Abaixo seguem alguns links sobre o assunto:

abnTex No Mac OS X

| Comments

Para instalarmos o abnTex primeiramente precisamos ter o MacTex instalado no mac.

Depois basta executar o conjunto de comandos no Terminal.app.

1
2
3
4
5
6
wget http://codigolivre.org.br/frs/download.php/5337/abntex-0.9-beta2.tar.gz
# or
curl http://codigolivre.org.br/frs/download.php/5337/abntex-0.9-beta2.tar.gz -o abntex-0.9-beta2.tar.gz
tar -xzf abntex-0.9-beta2.tar.gz
sudo cp -r abntex-0.9/ /usr/local/texlive/2011/texmf-dist/tex/latex/
sudo texhash

Na primeira ou na terceira linha baixamos a versão mais recente do abnTex, que apesar de estar em uma versão Beta possui uma boa estabilidade. Na quarta linha descompactamos o arquivo baixado. Na quinta linha copiamos os arquivos necessários para a pasta padrão de instalação do MacTex. Na sexta linha atualizamos a base de pacotes do Tex.

Qual duvida, critica ou sugestão não deixe de comentar.

Iniciando Com O Emacs

| Comments

A primeira coisa a se fazer para começar a usar o Emacs é instalá-lo. De preferencia a versão mais recente 24, que apesar de estar em fases final de testes já é bem estável a algum tempo. O processo de instalação depende do seu sistema operacional.

No Mac OS X com homebrew:

1
2
brew install emacs --HEAD --use-git-head --cocoa
brew linkapps

A flag --cocoa faz com que um aplicativo Emacs.app seja criado, se desejar usar o Emacs apenas no terminal, basta remover essa flag.

No Mac OS X com os binários:

1
2
3
wget http://emacsformacosx.com/emacs-builds/Emacs-pretest-24.0.95-universal-10.6.8.dmg
open Emacs-pretest-24.0.95-universal-10.6.8.dmg
cp /Volumes/Emacs/Emacs.app /Applications/

No Ubuntu:

1
2
3
sudo add-apt-repository ppa:cassou/emacs
sudo apt-get update
sudo apt-get install emacs-snapshot

Compilando apartir dos fontes:

1
2
3
4
5
6
7
8
wget http://emacsformacosx.com/emacs-sources/emacs-24.0.95.tar.gz
tar -xzf emacs-24.0.95.tar.gz
cd emacs-24.0.95
mkdir build
cd build
../configure
make
sudo make install

Depois de instalado, para executá-lo você pode usar algum laucher, digitar emacs no terminal, ou clicar no link criado no lugar correspondente ao seu sistema operacional (por exemplo: ~/Applications/Emacs.app no Mac OS X).

Uma imagem da tela de inicio do Emacs apos ele terminar de ser iniciado em modo gráfico.

Já em modo texto a imagem deve ser semelhante a essa:

Depois da instalação e da execução do Emacs a primeira coisa a se fazer é iniciar o modo tutorial, para que você possa entender melhor as características do Emacs.

Para iniciar o tutorial basta pressionar as teclas Meta (Alt) + x ou na linguagem do Emacs M-x. Este é um dos principais atalhos do Emacs, pois a partir dele qualquer outro comando pode ser executado. Você deve perceber que na na barra inferior deve ser possível entra com algum comando. Então basta digitar help-with-tutorial-spec-language e digitar o seu idioma de sua preferencia, no nosso caso Brazilian Portuguese

Mais fácil do que isso só baixando o mesmo tutorial em pdf e em pt-br neste link.

Links Uteis

Abaixo estão alguns links uteis para quem estar começando com o Emacs

Qualquer duvida, critica ou sugestão por favor comentem. Principalmente sobre melhorias, pois senti uma dificuldade muito grande ao escrever este post introdutório.