Currency format - Formatar moeda

August 22nd, 2008

Um amigo estava precisando de uma função para formatar campos de valores em R$ (reais) em formulários, ele achou umas por aí e pegou a que achou “melhorzinha”, modificou e ficou usando. Eu vi a função e falei: “Cara isso daí é uma droga! cheio de loops, ifs e elses, gambi mesmo”

Aí mostrei pra ele uma função do jsfromhell que me pareceu melhor. Só que ela tem um pequeno problema, quando tenho números com mais de 16 dígitos ela buga retornando o número como notação, por exemplo: 2183213123e31. Não que eu vá ter valores maiores que 16 dígitos, mas resolvi fazer a que segue abaixo:


String.prototype.currencyFormat = function (f, d, t) {
    var n = (n = this.match(/\d/g)) ? n.join('').replace(/^0+/,'') : '0', f = (f) ? f : 2, d = (d) ? d : ',', t = (t) ? t : '.';
    if (n.length < f + 1) return '0' + d + ((n.length < f) ? new Array(f - n.length + 1).join('0') + n : n)
    else return n.substr(0, n.length - f).split('').reverse().join('').match(/\d{1,3}/g).join(t).split('').reverse().join('') + d + n.substr(n.length - f)
}

Clique aqui para fazer download do código acima

Os argumentos são (usei os mesmos da função do jsfromhell, achei o suficiente):
f = número de casas decimais
d = separador de decimos (’,’ virgula por padrão)
t = separador de milhar (’.’ ponto por padrão)

Exemplos:

<input type="text" onkeyup="this.value = this.value.currencyFormat()" />
<input type="text" onkeyup="this.value = this.value.currencyFormat(3)" />
<input type="text" onkeyup="this.value = this.value.currencyFormat(3, ',', '.')" />

Recomendo usar uma class nos campos que quiser formatar e fazer uma rotina para adicionar a função nos campos com a tal class. Quem quiser a função sem compactação para poder entender melhor é só pedir. Testado no Firefox 3 e no Internet Explorer 6. Até!

batch mp3 id3, altere o id3 dos seus arquivos .mp3 com agilidade :)

April 6th, 2008

Update 1: Adicionei o módulo readline(valeu Tiago) que faz coisas muito interessantes no simples fato de importa-lo, histórico do que se digitou, as setas do teclado agora navegam no texto na hora da digitação, permite a implementação de auto completar e outras coisas mais.

Se você gosta das suas mp3 organizadas, como eu, isso será útil para você.
Sempre faço download de albuns completos, e nem sempre todos os arquivos vem organizados com o id3 correto. Então fiz esse script para organizar mais rápido.

from ID3 import *
import os, sys, readfile

# 2008-04-06
# batch mp3 id3, altere o id3 dos seus arquivos .mp3 com agilidade :)
# Author: Alisson Sales 
# http://alisson.zusee.com/
# http://alisson.zusee.com/blog

mp3s = []
last_artist = ”
last_album = ”

for root, dirs, files in os.walk(os.getcwd()):
    mp3s.extend([os.path.join(root, file) for file in files if os.path.splitext(file)[1] == ‘.mp3′])

mp3s.sort()

for mp3 in mp3s:
    id3info = ID3(mp3)
    print(os.path.basename(mp3))

    try:
        new_title = raw_input(’\tTitle: [%s] (type enter to keep it): ‘ % id3info.title)

        if (last_artist):
            new_artist = raw_input(’\tArtist: [%s] (type enter to keep it, - to last artist entered “%s”): ‘ % (id3info.album, last_artist))
        else:
            new_artist = raw_input(’\tArtist: [%s] (type enter to keep it): ‘ % id3info.artist)

        if (last_album):
            new_album = raw_input(’\tAlbum: [%s] (type enter to keep it, - to last album entered “%s”): ‘ % (id3info.album, last_album))
        else:
            new_album = raw_input(’\tAlbum: [%s] (type enter to keep it): ‘ % id3info.album)

        if id3info.track:
            new_track_number = raw_input(’\tTrack #: [%s] (type enter to keep it): ‘ % id3info.track)
        else:
            new_track_number = raw_input(’\tTrack #: [] (type enter to keep it): ‘)

    except KeyboardInterrupt:
        print(’\n\nApplication halted by the user\n’)
        sys.exit()

    if (new_title):
        id3info[’TITLE’] = new_title

    if (new_artist):
        if (new_artist == ‘-’ and last_artist):
            id3info[’ARTIST’] = last_artist
        else:
            id3info[’ARTIST’] = new_artist
            last_artist = new_artist

    if (new_album):
        if (new_album == ‘-’ and last_album):
            id3info[’ALBUM’] = last_album
        else:
            id3info[’ALBUM’] = new_album
            last_album = new_album

    if (new_track_number):
        id3info[’TRACKNUMBER’] = new_track_number

    print(”)

Você vai precisar do módulo ID3 instalado no seu python, que pode ser encontrado aqui

Para usar vá até a pasta onde se encontram os arquivos .mp3 e execute o script: python batch_id3.py

Depois adiciono mais opções, por enquanto é só. :)

Download do arquivo .py

Script em python para backup de bancos de dados firebird

March 30th, 2008
import subprocess
from datetime import datetime

# 2008-03-30
# A little script to backup firebird databases
# Author: Alisson Sales 

# path to gbak (firebird backup utility)
FB_GBAK       = ‘gbak’

# parameters for gbak (list)
FB_PARAMS     = [FB_GBAK, ‘-t’, ‘-user’, ‘SYSDBA’, ‘-pas’, ‘masterkey’]

# full path to database’s directory
FB_DB_DIR     = ‘/var/lib/firebird/2.0/data/’

# a tuple of databases to backup
FB_DATABASES  = (
    ‘DATABASE1.GDB’,
    ‘DATABASE2.GDB’
)

# full path to backup directory
FB_BACKUP_DIR = ‘/home/alisson/backup/firebird/’;

# path to data compressor (bzip2, zip, rar, gzip)
COMPRESSOR = ‘bzip2′

# just a shortcut
timestamp = lambda: datetime.now().strftime(’%Y-%m-%d %H:%M:%S’)

for db in FB_DATABASES:

    # sufix to backup filename
    sufix = ‘.’ + datetime.now().strftime(’%Y%m%d_%H%M%S’) + ‘.fbk’

    print “[%s] Starting backup of file %s” % (timestamp(), db)

    backup = []
    backup.extend(FB_PARAMS)
    backup.append(FB_DB_DIR + db)
    backup.append(FB_BACKUP_DIR + db + sufix)
    p = subprocess.Popen(backup, stderr=subprocess.PIPE)
    p.wait()
    error = p.communicate()[1]

    if not error:
        print “[%s] Backup is done.” % timestamp()
    else:
        print “[%s] Error:\n%s” % (timestamp(), error)

    print “[%s] Starting compression of backup file %s” % (timestamp(), db + sufix)

    compress = []
    compress.append(COMPRESSOR)
    compress.append(FB_BACKUP_DIR + db + sufix)
    p = subprocess.Popen(compress, stderr=subprocess.PIPE)
    # preventing too much use of CPU, compressing 1 file per time
    p.wait()
    error = p.communicate()[1]

    if not error:
        print “[%s] Compression is done.\n” % timestamp()
    else:
        print “[%s] Error:\n%s” % (timestamp(), error)

Adicionando no cron, no shell digite:

crontab -e

O cron abrirá o editor para edição.
Então adicione:

0   3   *   *   *   /home/USUARIO/backup_firebird.py > /var/log/backup_firebird.log

Isso fará com que o script seja executado diariamente as 3 da manhã e grave o log em /var/log/backup_firebird.log

Download do arquivo .py

Mais sobre o módulo subprocess:
PyMOTW: subprocess - O’Reilly ONLamp Blog
Python Library Reference

Ande pela cidade com o mapjack!

March 29th, 2008

Estava lendo meus fees li esse post e conheci o mapjack, http://www.mapjack.com/

A qualidade das fotos é impressionante, você pode usar as setas do teclado e ir adando pela cidade, ajustar a projeção da foto, o zoom, entre outros.

Será que o google vai comprar a tecnologia dos caras ou melhorar a que já tem usada no google maps, street view?

Mais:
review google street X mapjack

IssoCusta nova versão, grandes mudanças

March 20th, 2008

Acabei de colocar no ar as mudanças do IssoCusta. A idéia inicial do site tinha muitas semelhanças com um site de classificados, então o tornamos de vez um site de classificados, com alguns diferenciais. Um deles é que o usuário pode adicionar no mapa a localização do que está anunciando, assim as outras pessoas podem chegar mais fácil até ele, o google maps ainda permite que o usuário que visita um anuncio possa ver como chegar até o seu destino. Os usuários votam nos anúncios que acham interressantes criando um rank. Temos vários recursos que iremos implementar aos poucos. Visite o blog IssoCusta e fique sabendo quando atualizarmos algo.

Espero que gostem ;)

Issocusta.com beta!

January 21st, 2008

O issocusta.com é um projeto concebido para ser um indexador de preços no mundo real ou não. A idéia é que os usuários coloquem preços de ofertas vistas em qualquer lugar e também colocar preços de ofertas de algo que estão querendo vender. O objetivo é claro, queremos montar uma base de dados onde perguntas como “Quando custa aquela cerveja naquele local?” e “Quanto custa os ingressos do show?” serão respondidas pelos próprios usuários. Uma comparação à Wikipedia é obrigatória, a Wikipedia é uma base de dados de conhecimento e colaborativa. Somos uma base de dados de ofertas e colaborativa. A idéia se assemelha a do Craiglist, site americano de anúncios, mas tentamos ser uma forma diferenciada da idéia do Craiglist e de outros sites de anúncios. Temos mapas, preços podem ou não ser revisados por outros usuários. Temos também ranking e comentários. O issocusta.com se preocupa em resolver o problema localmente, isso é, usuários vêm somente as ofertas da cidade escolhida e as independente de cidade (ofertas de internet por exemplo).

Para criar o issocusta.com utilizamos a linguagem Python e o framework Django que tornou o nosso sonho bem mais possível num curto espaço de tempo. Utilizamos MySQL para nossa base de dados, Linux (ArchLinux) em nosso servidor e Mercurial para gerenciamento de código. A escolha dessas tecnologias se deram por vários motivos, mas acima de tudo porque servem para nós e resolvem muito bem as nossas necessidades.

O issocusta.com será lançado oficialmente em alguns dias, ainda estamos corrigindo bugs (reportem eles por favor!), adicionando e retirando algumas funcionalidades e, claro, testando.

Como desenvolvedor e entusiasta espero que o issocusta.com agrade a muitos e que seja realmente útil.

Internet Explorer 8 passando no teste ACID 2

December 20th, 2007

Desenvolvedores do Internet explorer 8 anunciam que o browser já rederiza corretamente o Acid2 Browser Test. Veja a screeshot logo abaixo.

internet explorer 8 passando no acid 2

Alguma novidade pra quem usa Opera? Acho que não, a mais de um ano o Opera já passava nesse teste. Mas o Firefox 2 aqui não passa, porém o Firefox 3 alpha já passou. Será que agora os problemas de CSS na hora do crossbrowser vão diminuir? Agora não, mas daqui a alguns anos… quem sabe? E o javascript? Ah.. isso é outra história…

Post oficial no blog do IE

Apareci como primeiro no google

December 19th, 2007

apareci no google

:)

Casando expressões regulares e substituindo com javascript

December 17th, 2007
window.onload = function () {
    var i = 0,
      ers = [new RegExp('ER_1', 'gi'),
             new RegExp('ER_2', 'gi'),
             new RegExp('ER_3', 'gi')],
toReplace = ['String 1',
             'String 2',
             'String 3'],
  content = document.body.innerHTML;

    for (i; i <= ers.length; i++) {
        content = content.replace(ers[i], toReplace[i])
    }

    document.body.innerHTML = content
}

Acabei nem usando pois os arquivos que precisava alterar não tinham nenhum padrão, então iriam ser muiiiiitas ERs. Usei o GNU sed para a maioria e alguns foi no olho mesmo. Para quem não conhece Expressões Regulares abaixo vão algumas dicas:

Saindo do bloglines

December 13th, 2007

Agora a pouco entrei no bloglines e levei um susto, 51064 posts para ler!
A algum tempo já estava chateado com erros que sempre aconteciam na versão beta e na “estável”, feeds que eu acabava de ler e retornavam algum tempo depois todos os posts como não lidos mesmo sem ocorrer nenhuma alteração. Sem falar nas vezes que precisava clicar mais de uma vez na lista de feeds para que o feed carregasse. Bem.. isso foi o bastante para eu mudar de agregador de feeds, vou usar o google reader. O que me incomoda é o fato de depender cada vez mais das ferramentas do google. Outro dia fui precisei consultar uma planilha que está salva no google docs e a planilha não estava disponível! Eu não tinha cópia no meu desktop, o jeito foi recorrer a algumas anotações e vasculhar na memória o que precisava. Depois de muito tempo a planilha apareceu denovo… Fazer o que, é de graça neh?!

Update 1:
Fui tentar agora deletar minha conta lá do bloglines, mas quem disse que achei o link para isso? Mandei um e-mail pra lá perguntando como fazer tal. Só me deu mais certeza de que fiz a escolha certa. Espero que me respondam…

Update 2: Até o momento(21/12/2007) não me responderam.. acho que estou preso no buraco negro chamado Bloglines.

Next »