goncin@wordpress.com:~$ _

Linux, programação e toda sorte de nerdices

Arquivos de tags: github

Números por extenso agora também em Ruby!

Há alguns meses, publiquei no GitHub uma classe PHP chamada GExtenso, que gera o extenso de números e moedas. O feedback foi bastante positivo: o pessoal começou a usar a minha classe como plugin para o CodeIgniter.

Desde o início, sempre tive a intenção de implementar o GExtenso em outras linguagens. Eu vinha estudando Ruby meio de brincadeira, mas para deixar a coisa mais séria resolvi que a primeira tradução seria para ela.

Tal qual a implementação original, em PHP, a versão em Ruby utilizou:

  • métodos estáticos, implementando o padrão de projeto (design pattern) SINGLETON;
  • chamadas recursivas a métodos, minimizando repetições e mantendo o código enxuto; e
  • tratamento de erros por intermédio de exceções.

ATENÇÃO: Este é o meu primeiro trabalho na linguagem Ruby. A lógica foi originalmente desenvolvida em PHP; portanto, o estilo do código pode não agradar programadores Ruby experientes. Estou aberto a críticas construtivas e sugestões, para melhorar meu conhecimento na linguagem.

Exemplos de uso

Para obter o extenso de um número, utilize GExtenso.numero.

require 'GExtenso.rb'

puts GExtenso.numero(832); # oitocentos e trinta e dois
puts GExtenso.numero(832, GExtenso::GENERO_FEM) # oitocentas e trinta e duas

Para obter o extenso de um valor monetário, utilize GExtenso.moeda.

require 'GExtenso.rb'

# IMPORTANTE: veja nota sobre o parâmetro 'valor' na documentação do método!
puts GExtenso.moeda(15402) # cento e cinquenta e quatro reais e dois centavos
puts GExtenso.moeda(47)   # quarenta e sete centavos
puts GExtenso.moeda(357082, 2, ['peseta', 'pesetas', GExtenso::GENERO_FEM], ['cêntimo', 'cêntimos', GExtenso::GENERO_MASC])
# três mil, quinhentas e setenta pesetas e oitenta e dois cêntimos

Download via github: http://github.com/goncin/GExtenso

Anúncios

Aventuras em Python (parte 1)

Estou há cinco meses usando quase que exclusivamente o Ubuntu tanto em casa quanto no trabalho. Acho que já está na hora de tomar vergonha na cara 😛 e aprender a programar para Linux.

Tenho percebido que muitos dos programas disponíveis no Ubuntu foram escritos em Python. Não acredita? Experimente digitar isso no seu terminal:

locate *.py

Por ora, meu conhecimento sobre esta linguagem limita-se a saber que ela é interpretada, de alto nível, e com a curiosa característica de ter seus blocos de código definidos pela indentação.

Malgrado já haver tantos programas em Python numa instalação padrão do Ubuntu, preferi descarregar um novo aplicativo para dar uma olhada nos fontes, para ver se entendo alguma coisa. Pode parecer uma técnica esquisita para se aprender uma nova linguagem de programação, mas acredite, comigo funciona. O aplicativo em questão é o Turpial, um promissor cliente para o Twitter. Sua aparência lembra um pouco o TweetDeck, com a vantagem de rodar nativamente em Linux, apesar de (ainda) não ter tantas funcionalidades quanto aquele.

Para instalar o programa no Ubuntu (de modo a utilizá-lo), bastam as seguintes linhas de comando:

sudo add-apt-repository ppa:effie-jayx/turpial
sudo aptitude update
sudo aptitude install turpial

Para estudar o código fonte, porém, o melhor é baixar os fontes do Turpial a partir do GitHub, com o seguinte comando no terminal:

git clone git://github.com/satanas/Turpial.git turpial

Caso você queira me acompanhar, e ainda não tenha o cliente git instalado, execute isso antes:

sudo aptitude install git-core

Os fontes estarão na pasta turpial (cd turpial), com a seguinte estrutura:

Estrutura dos arquivos do código fonte do Turpial

Estrutura dos arquivos do código fonte do Turpial

Para ser direto, meu interesse é sobre como são construídas as interfaces gráficas no ambiente Linux. Seguindo meus instintos, fui procurar alguma coisa sob a pasta gtk (pra quem não sabe, GTK+ é o nome da biblioteca de interface gráfica utilizado pelo ambiente GNOME e pelos respectivos programas). Dentre os arquivos que lá estavam, abri o denominado about.py para dar uma olhada.

Interface do Turpial exibindo o <em>About Box</em>

Interface do Turpial exibindo o About Box

# -*- coding: utf-8 -*-

# Ventana para subir el ego de los desarrolladores de Turpial xD
#
# Author: Wil Alvarez (aka Satanas)
# Dic 21, 2009

import os
import gtk

class About:
    def __init__(self, parent=None):
        about = gtk.AboutDialog()
        about.set_type_hint(gtk.gdk.WINDOW_TYPE_HINT_DIALOG)
        about.set_logo(parent.load_image('turpial_icon.png', True))
        about.set_name('Turpial')
        about.set_version(parent.version)
        about.set_copyright('Copyright (C) 2009 - 2010 Wil Alvarez')
        about.set_comments(_('Twitter client multi-interface written in Python'))
        about.set_transient_for(parent)
        about.set_position(gtk.WIN_POS_CENTER_ON_PARENT)

        try:
            path = os.path.realpath(os.path.join(os.path.dirname(__file__),
                '..', '..', '..', 'COPYING'))
            lic = file(path, 'r')
            license = lic.read()
            lic.close()
        except Exception, msg:
            license = 'This script is free software; you can redistribute it'
            'and\/or modify it under the\n\terms of the GNU General Public '
            'License as published by the Free Software\n\Foundation; either '
            'version 3 of the License, or (at your option) any later version.'
            '\n\n\You should have received a copy of the GNU General Public '
            'License along with\n\this script (see license); if not, write to '
            'the Free Software\n\Foundation, Inc., 59 Temple Place, Suite 330, '
            'Boston, MA  02111-1307  USA'
        about.set_license(license)
        authors = []
        try:
            path = os.path.realpath(os.path.join(os.path.dirname(__file__),
                '..', '..', '..', 'AUTHORS'))
            f = file(path, 'r')
            for line in f:
                authors.append(line.strip('\n'))
            f.close()
        except Exception, msg:
            pass

        about.set_authors(authors)

        about.connect("response", self.__response)
        about.connect("close", self.__close)
        about.connect("delete_event", self.__close)

        about.run()

    def __response(self, dialog, response, *args):
        if response < 0:
            dialog.destroy()
            dialog.emit_stop_by_name('response')

    def __close(self, widget, event=None):
        widget.destroy()
        return True

Consegui entender bem o que o código faz, mesmo porque é apenas um about box. Começa importando bibliotecas (linhas 8 e 9), antes de começar a definir a classe. Nesta, há um método construtor (__init__), no qual são definidos, primeiramente, o tipo e as propriedades da janela (linhas 13 a 21).

Entre as linhas 23 e 37, o código procura por um arquivo chamado COPYING, para dele extrair as informações de licença a serem exibidas na caixa de diálogo. Faz isso dentro de um bloco try...except, provendo uma saída sem erros para o caso de o arquivo não ser encontrado ou ocorrerem erros de leitura. Procedimento semelhante é feito entre as linhas 40 e 48, desta feita para ler o arquivo que contém a lista de autores.

Parece-me que a funcionalidade dos botões Créditos e Licença são providos pela classe AboutDialog do GTK+, tendo bastado ao autor apenas prover o conteúdo dos diálogos que abrem. A conexão é feita nas linhas 38 e 50, respectivamente.

Há um manipulador de respostas (__response), certamente para lidar com coisas do tipo “Sim/Não/Cancelar” ou “OK/Cancelar”, mas que, no contexto, serve apenas para fechar a janela, o que pode ser feito também pelo botão do decorador de janelas (__close).

Agora sinto-me um pouco menos analfabeto em Python. Acho que já aprendi as vogais. 😉

GExtenso: classe para geração de números por extenso em PHP

Post publicado originalmente em http://devfranca.ning.com/profiles/blogs/gextenso-classe-para-geracao em 2 de março de 2010.

GExtenso é uma classe que gera a representação por extenso de um número ou valor monetário.

Sua implementação foi feita como prova de conceito, utilizando:

  • Métodos estáticos, implementando o padrão de projeto (design pattern) SINGLETON;
  • Chamadas recursivas a métodos, minimizando repetições e mantendo o código enxuto;
  • Uso de pseudoconstantes (‘private static’) diante das limitações das constantes de classe;
  • Tratamento de erros por intermédio de exceções; e
  • Utilização do phpDocumentor para documentação do código fonte e geração automática de documentação externa.

EXEMPLOS DE USO

Para obter o extenso de um número, utilize GExtenso::numero.

echo GExtenso::numero(832); // oitocentos e trinta e dois
echo GExtenso::numero(832, GExtenso::GENERO_FEM); // oitocentas e trinta e duas

Para obter o extenso de um valor monetário, utilize GExtenso::moeda.

// IMPORTANTE: veja nota sobre o parâmetro 'valor' na documentação do método!
echo GExtenso::moeda(15402); // cento e cinquenta e quatro reais e dois centavos
echo GExtenso::moeda(47); // quarenta e sete centavos
echo GExtenso::moeda(357082, 2,
  array('peseta', 'pesetas', GExtenso::GENERO_FEM),
  array('cêntimo', 'cêntimos', GExtenso::GENERO_MASC)
); // três mil, quinhentas e setenta pesetas e oitenta e dois cêntimos

Download via github: http://github.com/goncin/GExtenso

%d blogueiros gostam disto: