segunda-feira, novembro 29, 2010

E_DINHEIRO Validador para web2py

Criei um validator para web2py, mas ao nomear, fugi do padrão IS_SOMETHING, já que o formato é específico do Brasil.

Assim, usei E_DINHEIRO, apenas para facilitar a formatação. O tipo de campo para armazenamento deve ser decimal, mas é necessário excluir a linha que possui a palavra 'double' em web2py_ajax.html, pois ele impede a digitação de vírgulas:
-------------------------------------------------------------------------------------------------------------------------------
jQuery('input.double,input.decimal').live('keyup', function(){this.value=this.value.reverse().replace(/[^0-9\-\.]|[\-](?=.)|[\.](?=[0-9]*[\.])/g,'').reverse();});
------------------------------------------------------------------------------------------------------------------------------
Parece que pode ser possível adaptar a linha acima para aceitar vírgulas, quem souber como fazer deixe um comentário.



class E_DINHEIRO(object):
    def __init__(self, format=True, error_message='Digite o valor!'):
        self.format = format
        self.error_message = error_message
    def __call__(self, value):
            

            d=str(value)
            
            d = d.replace('.','')
            
            d = d.replace(',','.')
            
            #return (value, valor[-3:-2])
            try:
                return (d, None)
            except:
                return (d,str(d)+'o valor digitado não é um número válido')
 
    def formatter(self, value):
            value  = str(value)
            c = []
            for d in value:
               if d.isdigit():
                   c.append(d)
            value = str(''.join(c))
            l = len(value) #10 = 1000000000 = 10.000.000,00
            i = l - 2 #8
            p = i / 3 #2
            r = (l % 3) #2
            #p = 3
            pf = i-1
            if l == 1:
                formatado = '0,0'+value
            
            elif l == 2:
                formatado = '0,'+value
            elif l > 2:
                d = ','+value[-2:]
                s = ''
                n = r+1
                s += value[0:r+1]
                if i > 3:
                    while n < i:
                        pt = n + 3
                        s += '.'+ value[n:pt] 
                        n = pt
                                
                formatado = s+d        
            else:
                formatado = value
            return formatado

Use o validator como um validator comum do web2py:

Field('preco','decimal(20,2)',requires=E_DINHEIRO(),represent=lambda field:currency(field), label='Preço'),

Para permitir apresentar o formato quando não está usando formulário,  use:


def currency(value):
  

    import locale
    locale.setlocale( locale.LC_ALL, 'pt_BR.UTF-8' )
    value = locale.currency(value,grouping=True)
    return value

em uma view:

{{=currency(row.preco)}}



--
Atenciosamente

--
=========================
Alexandre Andrade
Hipercenter.com

quinta-feira, novembro 25, 2010

Validator IS_CPF_OR_CNPJ para web2py

class IS_CPF_OR_CNPJ(object):

    def __init__(self, format=True, error_message='Digite apenas os números!'):
        self.format = format
        self.error_message = error_message
    def __call__(self, value):
        try:
            #return (value, 'cpf incorreto'+str(value))
            #return (value, 'cpf incorreto'+str(cl))
            c = []
            for d in value:
               if d.isdigit():
                   c.append(d)
            cl = str(''.join(c))
            #return (value, 'cpf incorreto'+str(cl))
            if  len(cl) == 11:
                cpf = cl
                cnpj = None
            elif  len(cl) == 14:
                cpf = None
                cnpj = cl
            else:
                return (value, 'Número de dígitos incorreto para CPF ou CNPJ')

            #return(cpf,'aquiok'+str(len(cpf)==11))
            if cpf:
              
                def valida(value):
                  
                    def calcdv(numb):
                      
                        result = int()
                        seq = reversed(((range(9, id_type[1], -1)*2)[:len(numb)]))
                        #return (value,'to fundo1')
                        for digit, base in zip(numb, seq):
                            result += int(digit)*int(base)
              
                        dv = result % 11
                        #return (value,'to fundo1'+str(dv))
                        return (dv-10) and dv or 0
                  
                    id_type = ['CPF', -1]
                  
                  
                    numb, xdv = value[:-2], value[-2:]
                  
                    dv1 = calcdv(numb)
                    #return (value,'entrei'+str(dv1))
                    dv2 = calcdv(numb + str(dv1))
                    return (('%d%d' % (dv1, dv2) == xdv and True or False), id_type[0])  
          
          
                try:
                    cpf=str(value)
                    #return(cpf,'aquiok'+str(len(cpf)==11))
                    if len(cpf)>=11:
                      
                        #return (value, 'cpf acima de 11')
                        c = []
                        for d in cpf:
                           if d.isdigit():
                               c.append(d)
                        cl = str(''.join(c))
                        #return (value, 'cpf incorreto'+str(cl))
                        if  len(cl) == 11:
                            if valida(cl)[0] == True:
                                return(value,None)
                            else:
                                return (value, 'cpf inválido')
                        elif  len(cl) < 11:
                            return (value, 'cpf incompleto')
                        else:
                            return (value, 'cpf tem mais de 11 dígitos')
                        if cpf[3] != '.' or cpf[7] != '.' or cpf[11] != '-' :
                            return (value, 'cpf deve estar no formato 000.000.000-00'+cpf[11])
                    else:
                        return (value, 'cpf deve estar no formato 000.000.000-00')
                    #return(cpf,'aquiok'+str(len(cpf)==11))
                except:
                    return (value, 'algum erro'+str(value))
            elif cnpj:

                   """ Pega apenas os 12 primeiros dígitos do CNPJ e gera os 2 dígitos que faltam """
                   inteiros = map(int, cnpj)
                   novoCnpj = inteiros[:12]

                   prod = [5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2]
                   while len(novoCnpj) < 14:
                      r = sum([x*y for (x, y) in zip(novoCnpj, prod)]) % 11
                      if r > 1:
                         f = 11 - r
                      else:
                         f = 0
                      novoCnpj.append(f)
                      prod.insert(0, 6)
                   #return(str(novoCnpj),'aquiok')
                   """ Se o número gerado coincidir com o número original, é válido """
                   if novoCnpj == inteiros:
                      #cnpj = ''.join(novoCnpj)
                    
                      return(str(cnpj),None)

                   else:
                      return (value, 'CNPJ não é válido')
              


        except:
            return (value, 'algum erro'+str(value))
    def formatter(self, value):
            if len(value)==11:
                formatado = value[0:3]+'.'+value[3:6]+'.'+value[6:9]+'-'+value[9:11]
            elif len(value)==14:
                formatado = value[0:2]+'.'+value[2:5]+'.'+value[5:8]+'/'+value[8:12]+'-'+value[12:14]
            else:
                formatado = value
            return formatado

Validator TELEFONE para web2py: IS_TELEFONE

Também tive que criar um validator para telefone, com ddd


class IS_TELEFONE(object):
    def __init__(self, format=True, error_message='Digite apenas os números!'):
        self.format = format
        self.error_message = error_message
    def __call__(self, value):
        try:
            telefone=str(value)
            #return(cpf,'aquiok'+str(len(cpf)==11))
            if len(telefone)>=10:
                #return (value, 'cpf acima de 11')
                c = []
                for d in telefone:
                   if d.isdigit():
                       c.append(d)
                cl = str(''.join(c))
                #return (value, 'cpf incorreto'+str(cl))
                if  len(cl) == 10:
                    return(str(cl),None)
                elif  len(cl) < 10:
                    return (value, 'telefone incompleto')
                else:
                    return (value, 'o telefone tem mais de 10 dígitos')
                if cpf[2] != '-' or cpf[7] != '-':
                    return (value, 'o telefone deve estar no formato 00-0000-0000')
            else:
                return (value, 'O telefone deve estar no formato 00-0000-0000')
            #return(cpf,'aquiok'+str(len(cpf)==11))
        except:
            return (value, 'algum erro'+str(value))
    def formatter(self, value):
            if len(value) == 10:
                formatado = value[0:2]+'-'+value[2:6]+'-'+value[6:10]
            else:
                formatado = value      
            return formatado


--
Atenciosamente

--
=========================
Alexandre Andrade
Hipercenter.com

Validator CPF para web2py: IS_CPF

Por necessidade, criei um validator para ser usado no Web2py:


class IS_CPF(object):
    def __init__(self, format=True, error_message='Digite apenas os números!'):
        self.format = format
        self.error_message = error_message
    def __call__(self, value):

        def valida(value):
          
            def calcdv(numb):
              
                result = int()
                seq = reversed(((range(9, id_type[1], -1)*2)[:len(numb)]))
                #return (value,'to fundo1')
                for digit, base in zip(numb, seq):
                    result += int(digit)*int(base)
      
                dv = result % 11
                #return (value,'to fundo1'+str(dv))
                return (dv-10) and dv or 0
          
            id_type = ['CPF', -1]
          
          
            numb, xdv = value[:-2], value[-2:]
          
            dv1 = calcdv(numb)
            #return (value,'entrei'+str(dv1))
            dv2 = calcdv(numb + str(dv1))
            return (('%d%d' % (dv1, dv2) == xdv and True or False), id_type[0])  
  
  
        try:
            cpf=str(value)
            #return(cpf,'aquiok'+str(len(cpf)==11))
            if len(cpf)>=11:
              
                #return (value, 'cpf acima de 11')
                c = []
                for d in cpf:
                   if d.isdigit():
                       c.append(d)
                cl = str(''.join(c))
                #return (value, 'cpf incorreto'+str(cl))
                if  len(cl) == 11:
                    if valida(cl)[0] == True:
                        return(value,None)
                    else:
                        return (value, 'cpf inválido')
                elif  len(cl) < 11:
                    return (value, 'cpf incompleto')
                else:
                    return (value, 'cpf tem mais de 11 dígitos')
                if cpf[3] != '.' or cpf[7] != '.' or cpf[11] != '-' :
                    return (value, 'cpf deve estar no formato 000.000.000-00'+cpf[11])
            else:
                return (value, 'cpf deve estar no formato 000.000.000-00')
            #return(cpf,'aquiok'+str(len(cpf)==11))


        except:
            return (value, 'algum erro'+str(value))
    def formatter(self, value):
          
            formatado = value[0:3]+'.'+value[3:6]+'.'+value[6:9]+'-'+value[9:11]
            #formatado = value
            return formatado

--
Atenciosamente

--
=========================
Alexandre Andrade
Hipercenter.com

domingo, novembro 14, 2010

os carros mais roubados e os carros menos roubados

A Susep disponibiliza uma estatística completa e detalhada de roubos de carros em todo o território nacional.

Pode-se escolher o nível de detalhamento, o estado,, entre várias opções.

O link direto é http://www.susep.gov.br/menuestatistica/RankRoubo/menu1.asp

--
Atenciosamente

--
=========================
Alexandre Andrade
Hipercenter.com

quarta-feira, novembro 10, 2010

paypal x moneybookers x google checkout

Estive comparando os serviços de intermediação de pagamentos e fiz a seguinte comparação para quem está no brasil e precisa receber em dólares, de compradores de outros países

taxas (iniciais)

paypal (7,4% + 0.40BRL) para transações oriundas de outros países.

moneybookers (2,9% +0.29EUR +1% para retirar o dinheiro + 1,99% para conversões de moedas)

google checkout (2,9% + $0,30 +1% para recebimento internacional)


Fica evidente que o menor custo para operar é o do google.






--
Atenciosamente

--
=========================
Alexandre Andrade
Hipercenter.com

terça-feira, novembro 02, 2010

converter formatos de arquivo lossless (ape, wv, flac) com .cue para mp3 no linux

Hoje tive necessidade de converter uma discografia lossless no linux para formato mp3.


1.Formato .flac para mp3

usei o pacpl

# apt-get install pacpl

e depois fazer a conversão em todos os subdiretórios

pacpl --to mp3 -r diretorio/


2. Formato .wv com .cue para .mp3

Instalação do shntool

# apt-get install shntool

agora a conversão do arquivo wv para .flac (não consegui converter diretamente para mp3, então usei um formato intermediário)

# shntool conv -i wv -o mp3 arquivo.wv

agora, converter de .flac para .mp3

# pacpl --to mp3  arquivo.flac

e por fim, dividir o arquivo mp3 usando o arquivo .cue, usando o mp3split

baixe os arquivos/pacotes para sua distro em http://mp3splt.sourceforge.net/mp3splt_page/downloads.php e

# mp3split arquivo.mp3 -c arquivo.cue -a

voiĺá, todos os arquivos nomeados e com tags.


3. Formato ape com cue.

é necessário instalar a biblioteca jmac (mac) com

# apt-get install libjmac-java

Se necessário, instale o java
(inclua a linha abaixo no arquivo /etc/apt/sources.list)

# deb http://archive.canonical.com/ubuntu lucid partner

e instale

# apt-get install sun-java6-jre

então, converta para wav

# jmac d arquivo.ape arquivo.wav

e de wav para mp3:

# pacpl --to mp3  arquivo.flac

Finalmente, dividir o arquivo .mp3 :

# mp3split arquivo.mp3 -c arquivo.cue -a

--
Atenciosamente

--
=========================
Alexandre Andrade
Hipercenter.com

quinta-feira, outubro 28, 2010

Usando VNC via ssh

A dica é simples:

vncviewer -via user@host host:1

Onde 1 é o número do display no vnc4server.


--
Atenciosamente

--
=========================
Alexandre Andrade
Hipercenter.com

Como converter .flac (loseless) para mp3 no linux

No ubuntu 10.10, basta um:

apt-get install soundconverter


A interface é simples e intuitiva, veja em

http://soundconverter.berlios.de/

--
Atenciosamente

--
=========================
Alexandre Andrade
Hipercenter.com

quarta-feira, outubro 20, 2010

Investir em pessoas - empreste seu dinheiro e tenha mais retorno

O Fairplace é uma comunidade de empréstimos.

Você pode tanto emprestar (um mínimo de 50 reais) quanto pegar emprestado.

www.fairplace.com.br
--
Atenciosamente

--
=========================
Alexandre Andrade
Hipercenter.com

terça-feira, outubro 19, 2010

Site para avaliação de sites

Algumas vezes queremos ter uma referência externa sobre algum site.

Uma forma interessante são sites que avaliam o valor em dólares de um site, com base em estatísticas disponíveis na web.

Um site que pode ser utilizado para isso é

http://mysitecost.com/

Ele consegue fazer uma avaliação bem pé no chão no meu entender.

Já o
http://bizinformation.org/br/ não parece fundamentar muito suas avaliações. Os valores parecem exagerados para sites pequenos e subestimados para sites grandes.



--
Atenciosamente

--
=========================
Alexandre Andrade
Hipercenter.com

quinta-feira, setembro 02, 2010

] DICA--otimizando gedit para completar codigo python



interessante para quem so utiliza gedit, autocompleta codigo python

http://github.com/fenrrir/geditpycompletion
--
        Ovidio Marinho Falcao Neto
             ovidioccg@gmail.com
         Tecnologia da Informaçao
         Casa Civil do Governador
         83 3214 7885 - 88269088
                  Paraiba




--
Atenciosamente

--
=========================
Alexandre Andrade
Hipercenter.com

sexta-feira, junho 18, 2010

Modelagem de Processos - Resumo

1. Foco no resultado do processo: antes de pensar nas atividades envolvidas, defina qual o resultado devera ser produzido do ponto de vista do ciente.
2. Conheça as necessidades do cliente - > realize pesquisas antes de modelar o processo
3. Conhecidas as necesidades, documente sua especificação > Carta de Serviços
4. Indentificar possíveis insumos (material de consumo), referências (normas) e infra-estrutura (equipamentos)
5. Cada pessoa envolvida no processo descreve suas próprias atividades, gerando comprometimento e velocidade.
6. Definir critérios de aceitação para os insumos, referências, infra-estrutura
7. Se todos os fatores convergirem, teremos assegurado a qualidade do produto.
8. No mapeamento das atividades, considerar as contigências e não apenas o 'caminho feliz'
9. Simule, para testar a aplicabilidade do processo



--
Atenciosamente

--
=========================
Alexandre Andrade
Hipercenter.com

quinta-feira, junho 10, 2010

Simulador de Processos Opensource


Após muito tempo, finalmente encontrei a cabeça do bacalhau: um simulador de processos visual e gratuito.



--
Atenciosamente

--
=========================
Alexandre Andrade
Hipercenter.com

domingo, maio 23, 2010

Ciclo de relase do OpenBSD


O vídeo completo pode ser visto aqui:

http://www.youtube.com/watch?v=i7pkyDUX5uM&feature=player_embedded

Mas basicamente, o segredo do BSD para as versões saírem sempre na data programada é:

- no início do período, se definem as correções e pequenas melhorias em relação à versão anterior, os novos recursos e as grandes mudanças são incluídas no ínicio.

- Gerar snapshots completos todo dia, dessa forma sempre se pode testar o estágio atual de desenvolvimento, e os problemas vão sendo corrigidos e a versão evolui.

- no final do período, estabelece-se um período de lock-in, a partir do qual são apenas alguns ajustes finos.
- todas as datas de lock e unlock são surpresas, porque pessoas avisadas são mais preguiçosas. Se não avisadas, as pessoas buscam terminar a tarefa e os testes o quanto antes.
- desenvolvedores com baixo nível de testes são punidos.


--
Atenciosamente

--
=========================
Alexandre Andrade
Hipercenter.com

quinta-feira, maio 20, 2010

Script to generate web2py schema (models) from mysql

#!/usr/bin/env python
# -*- coding: utf-8 -*-
#script to generate schemas from dbs
#by Alexandre Andrade alexandremasbr@gmail.com
#www.hipercenter.com

#place your config here
passwd="mypass"
user="myuser"
host="localhost"
db = 'mydb'
port='3306'

import MySQLdb
bd=MySQLdb.connect(host=host,user=user,passwd=passwd,db = db, use_unicode=True)

def query(bd,sql):
bd.query(sql)
r = bd.store_result()
rows = r.fetch_row(maxrows=0,how=1)
return rows

def get_tables():
rows = query(bd,'show tables')
tables=[]
for row in rows:
tables.append(row['Tables_in_'+db])
return tables

#tables()

def get_fields(table):
print table
rows = query(bd,'show fields from '+ table)
fields=[]
for row in rows:
#print row
fields.append(row)
return fields

def field_type(field):
if field['Type'][0:7]=='varchar':
tipo = ",'string'"
elif field['Type'][:8]=='longtext':
tipo = ",'text'"
elif field['Type'][:3]=='int':
tipo = ",'integer'"
elif field['Type'][:4]=='date':
tipo = ",'date'"
elif field['Type'][:7]=='tinyint':
tipo = ",'int'"
elif field['Type'][:11]=='mediumtext':
tipo = ",'text'"
elif field['Type'][:4]=='char':
tipo = ",'text'"
else:
print field['Type'][0:10]
return tipo

def primarykey(field):
if field['Extra']=='auto_increment':
pk = True
else:
pk = False
return pk

def define_table(table):
fields = get_fields(table)
result = []
head = 'db = DAL("mysql://'+ user+ ':'+passwd+'@'+host+':'+port+'/'+db+'", pool_size=10)\r\r'

line = "db.define_table('"+table+"'"
result.append(line)
for field in fields:
if primarykey(field) == True:
pk =field['Field']
#print pk
tipo = field_type(field)
line = " Field('"+field['Field']+"'"+tipo+")"
result.append(line)
line
try:
line = " primarykey=['"+pk+"']"
result.append(line)
except:
pass
out = ',\r'.join(result)
output = head + out + '\r)'
print output
return output

def define_db():
tables = get_tables()
r = []
for table in tables:
r.append(define_table(table))
result = '\r \r'.join(r)
return result

r = define_db()
f = open('db_'+db+'.py', 'w')
f.write(r)
f.close()

Finally I have done it. 

It can be improved to a form in appadmin, use the model to another db (postgresql, etc), and generate the file in /models.

You can see the code below: 

----------------------------------------------------------

#!/usr/bin/env python
# -*- coding: utf-8 -*-
#script to generate schemas from dbs
#by Alexandre Andrade alexandremasbr@gmail.com

#config it here
passwd="mypass"
user="myuser"
host="localhost"
db = 'mydb'
port='3306'


def query(bd,sql):
    bd.query(sql)
    r = bd.store_result()
    rows = r.fetch_row(maxrows=0,how=1)
    return rows
    
def get_tables():
    rows = query(bd,'show tables')
    tables=[]
    for row in rows:
        tables.append(row['Tables_in_'+db])
    return tables
    
#tables()

def get_fields(table):
    print table
    rows = query(bd,'show fields from '+ table)
    fields=[]
    for row in rows:
        #print row
        fields.append(row)
    return fields
    
def field_type(field):
    if field['Type'][0:7]=='varchar':
        tipo = ",'string'"
    elif field['Type'][:8]=='longtext':
        tipo = ",'text'"
    elif field['Type'][:3]=='int':
        tipo = ",'integer'"
    elif field['Type'][:4]=='date':
        tipo = ",'date'"
    elif field['Type'][:7]=='tinyint':
        tipo = ",'int'"
    elif field['Type'][:11]=='mediumtext':
        tipo = ",'text'"
    elif field['Type'][:4]=='char':
        tipo = ",'text'"
    else:
        print  field['Type'][0:10]
    return tipo
    
def primarykey(field):
    if field['Extra']=='auto_increment':
        pk = True
    else:
        pk = False
    return pk

def define_table(table):
    fields =  get_fields(table)
    result = []
    head = 'db = DAL("mysql://'+ user+ ':'+passwd+'@'+host+':'+port+'/'+db+'", pool_size=10)\r\r'

    line = "db.define_table('"+table+"'"
    result.append(line)  
    for field in fields:
        if primarykey(field) == True:
            pk =field['Field']
            #print pk
        tipo = field_type(field)
        line = "    Field('"+field['Field']+"'"+tipo+")"
        result.append(line)
        line
    try:
        line = "    primarykey=['"+pk+"']"
        result.append(line)
    except:
        pass
    out = ',\r'.join(result)
    output = head + out + '\r)'
    print output
    return output

def define_db():
    tables = get_tables()
    r = []
    for table in tables:
        r.append(define_table(table))
    result = '\r \r'.join(r)
    return result

r = define_db()
f = open('db_'+db+'.py', 'w')
f.write(r)
f.close()

-----------------------------------------------------------

--
Atenciosamente

--
=========================
Alexandre Andrade
Hipercenter.com



--
Atenciosamente

--
=========================
Alexandre Andrade
Hipercenter.com

terça-feira, maio 04, 2010

Dica: VLC permite ver dvds em .iso ou .nrg sem montar

É isso mesmo. Antes de saber disso, eu montava os arquivos .iso com ferramentas como o Daemon Tools ou gmount para ver os dvds.

No Linux o problema era maior, porque os players do linux acessam diretamente os dispositivos, e não  diretório montado.

Com o VLC, isso ficou mais simples:  basta ir em abrir, e abrir o arquivo .iso ou .nrg.

Mais fácil, impossível.

--
Atenciosamente

--
=========================
Alexandre Andrade
Hipercenter.com

segunda-feira, maio 03, 2010

Gestão Pública do Esporte

Estou trabalhando há dois meses com a área de Esportes no Setor Público.


Onde trabalho se faz uma divisão em três tipos de esportes para políticas públicas:


  1. Esporte educacional – Políticas desenvolvidas em conjunto com a área educacional, focam essencialmente o ensino básico e médio

  2. Esporte de participação – Políticas desenvolvidas com o objetivo da prática esportiva para lazer e saúde, basicamente.

  3. Esporte de rendimento – Políticas para o esporte de competição amador.


Não percebi um esforço estruturado para profissionalizar o esporte, embora o esporte profissional seja o grande chamariz para a prática esportiva.


Também pouco se fez para estimular o Esporte como um setor da economia, como o Turismo ou até mesmo a Cultura.


É fato que trabalhar com esporte envolve atender a diversos públicos, com objetivos distintos, e normalmente com recursos muito escassos.


Quem for trabalhar nessa área, tem que ter um papel de articulação muito grande, pois há grande possibilidades de parcerias, mas pouco aproveitadas.


Também é muito pouco aproveitado o potencial de cooperação regional entre os municípios. A cooperação entre eles é essencial para vitalizar o esporte, especialmente o de rendimento e eventualmente o profissional.


Se alguém tiver algum material sobre gestão pública do Esporte e quiser me encaminhar, pode enviar para o e-mail alexandremasbr (arroba) gmail.com


--
Atenciosamente

--
=========================
Alexandre Andrade

quarta-feira, março 10, 2010

Razões para uma empresa fechar a porta

fonte:


30 razões que levam uma empresa a fechar as portas


Confira quais são os 30 erros mais comuns das empresas, seja na administração de pessoas, processos ou finanças

Provavelmente nunca ninguém lhe falou as principais falhas que você micro ou pequeno empresário pode estar cometendo na gestão financeira da sua empresa. Aproveite este artigo, o qual foi sugerido por um aluno e empresário.

"Eu já montei e tive que fechar cinco empresas, depois dessa cruel experiência decidi voltar para a sala de aula". Este foi o desabafo que um dos alunos do curso de Planejamento e gestão  financeira, fez no primeiro dia de aula. A resistência para sair da rotina de trabalho, originada quase sempre pelo conforto é grande, mas chega uma hora que não tem outra saída. Foi o caso deste empresário, que depois dessa triste experiência, que aconteceu entre os 33 e 58 anos de idade, decidiu buscar conhecimento e se atualizar.

Vejamos as principais falhas que temos percebido na área financeira, tanto em trabalhos de consultoria e assessoria, como em cursos abertos e fechados:

1. Acreditar que basta colocar um software de gestão financeiro para controlar as contas da empresa.

2. Acreditar que somente um funcionário pode tomar conta das finanças, dependendo do tamanho da empresa.

3. Acrescentar às contas da empresa, suas contas particulares e até as contas da família, para o funcionário controlar.

4. Misturar as contas da empresa com as contas particulares, inclusive com cartões de crédito pessoal, transferências de contas (pessoa física/pessoa jurídica), etc.

5. Fazer retiradas avulsas das contas da empresa durante o mês de acordo com sua necessidade particular.

6. Valor do pró-labore crescente e/ou indefinido (variável) todo mês.

7. Não registrar as entradas e saídas de dinheiro com precisão e no instante do fato.

8. Não dispor de um plano de contas gerencial (não tributário) que identifique e agrupe as principais contas da empresa (entradas e saídas no caixa e receita e despesa no demonstrativo de resultados).

9. Exigir do funcionário melhor controle, sem este dispor das condições da segurança e da autonomia para controlar o caixa.

10. Colocar o funcionário do financeiro para fazer outros serviços ou serviço externo.

11. Pegar dinheiro do caixa, sem comunicar o responsável pelo controle.

12. Acreditar que o saldo do caixa no final do mês é o lucro da empresa.

13. Não controlar e fazer inventários periódicos, valorizando o estoque.

14. Não dispor de controles a fim de conhecer com precisão o estoque inicial, estoque final e o custo da mercadoria vendida (ou custo da matéria prima).

15. Gastar o saldo do caixa para pagar contas particulares e outros negócios.

16. Não fazer uma reserva de caixa para despesas eventuais de final e inicio de ano.

17. Acreditar que é difícil (ou impossível) fazer uma previsão de fluxo de caixa.

18. Confundir lucratividade com rentabilidade.

19. Confundir fluxo de caixa com demonstrativo de resultados.

20. Confundir custos fixos com variáveis e vice-versa.

21. Acreditar que acrescentando uma porcentagem "X" aos custos operacionais, é a forma correta de formar o seu preço de venda.

22. Não considerar descontos, devoluções, garantias e as despesas escondidas como: encargos sociais, depreciação, seguros, etc, na apuração de resultados.

23. Confundir contas de caixa com contas de resultados.

24. Confundir regime de caixa com regime de competência.

25. Não calcular e atualizar o capital de giro necessário para a empresa.

26. Não conhecer e nem calcular o seu ponto de equilíbrio para controle, tomada de decisões e criação de estratégias sazonais.

27. Não saber com precisão qual o lucro (ou prejuízo) da empresa.

28. Acreditar que são os funcionários que precisam da empresa (emprego).

29. Contratar mais parentes baseado somente pela confiança e/ou por pena.

30. Prescindir das novas tecnologias da informação.

Como consequência dessas inconformidades, a empresa estagna, não consegue mais crescer e logo em seguida passa a pagar seus compromissos com atraso. Depois passa a depender de empréstimos bancários e por último passa a demitir funcionários para diminuir a folha de pagamentos. Com isso cai a produtividade e a qualidade dos serviços.

Daí os clientes começam a migrar para os concorrentes mais atualizados e agressivos, terminando com o fechamento do negócio. Essa é a triste história deste aluno e de milhares de empreendedores e pequenos empresários do Brasil e do planeta inteiro.  O negócio era bom em quanto era pequeno – dava para administrar e ganhar dinheiro.

Agora, as condições externas e internas estão muito diferentes, os clientes estão cada vez mais exigentes, existem muito mais opções no mercado para atender as mesmas necessidades. Depois que a empresa começa a crescer, a situação fica mais difícil de administrar.

Se pelo menos cinco destas situações estiverem acontecendo com você (ou com seu amigo), sua situação é delicada e muito perigosa. A tendência é piorar cada vez mais.



--
Atenciosamente

--
=========================
Alexandre Andrade
Hipercenter.com

segunda-feira, fevereiro 22, 2010

A terra está crescendo? - Earth is growing?

Há algum tempo, já vinha matutando comigo que fazia algum sentido que a terra estivesse crescendo.

O afastamento dos continentes, bem como as sucessivas camadas de terra em qualquer terreno, arqueológico ou não, incitam nossa imaginação nesse sentido.

Além disso, temos o fato da energia não se perde, e recebemos luz do sol (energia) todo dia. Diz a teoria que energia é proporcional à massa, então, se retemos energia do sol, de alguma forma isso deve ser transformada em massa.

Ao longo do tempo, seja pela fotossíntese, ou outro processo qualquer, ou mesmo por vários processos distintos, paulatinamente a energia recebida do sol diariamente seria acumulada na terra, gerando um aumento de massa (e volume).

Suspeito até que o volume de água na terra esteja crescendo ao longo do tempo, já que nada me prova que os oceanos eram naturalmente grandes há bilhões de anos. Parte da energia recebida do sol estaria sendo transformada em água. Não há explicação científica convincente de como a 'poeira de estrela' ou seja, a nuvem de gás que era originalmente a terra se transforma em uma outra matéria (atómo).

O caminho para entender o crescimento da terra é entender como ocorre essa transformação da luz em matéria.

Somente após pensar em escrever este mini-artigo, procurei na internet e achei informações sobre gente que já tinha teoria semelhante.


O melhor artigo que encontrei sobre o tema está em http://en.wikipedia.org/wiki/Expanding_Earth (em inglês).

Há uma coleção de  vídeos de um dos defensores, que pode ser encontrado em:

http://www.nealadams.com/nmu.html


--
Atenciosamente

--
=========================
Alexandre Andrade
Hipercenter.com

quarta-feira, fevereiro 10, 2010

Adeus ao Windows - Agora só Linux

8 anos depois de começar a mexer com Linux, finalmente posso abandonar o Windows por completo.

A última desculpa que eu tinha eram os jogos, e agora, finalmente, consegui rodar o Pro Cycling Manager no Linux.

Como é meu jogo preferido, e os outros não importam tanto, estou pronto para a mudança.

Windows, bye, bye.


O processo para configurar o PCM 2009 no Linux foi relativamente simples:

1. Instalar o PlayOnLinux
2. Instalar o PCM manualmente, criando um novo wineprefix.
3. Instalar o Directx, editando o prefixo do wine.
4. Instalar o NetFramework, editando o prefixo do wine
5. Instalar o patch 1.0.3.3 do PCM
6. Finalmente, tive que crackear (colocar os arquivos do crack), apesar de meu jogo ser original. (o wine não consegue instalar os drivers de restrição do patch do  PCM)

Agora, outros jogos, só se forem emulados ou forem para Linux. :-)



--
Atenciosamente

--
=========================
Alexandre Andrade
Hipercenter.com

domingo, fevereiro 07, 2010

como configurar web2py e php no mesmo servidor (debian ou ubuntu)

Observação: embora no mesmo servidor, eles usarão domínios ou subdomínios diferentes (virtualhosts)



O primeiro passo é instalar o web2py com o script setup_web2py.sh, no link abaixo:

http://www.megaupload.com/?d=48Y3TQ9C

ele já foi alterado para incluir o postgresql 8.4


# sudo setup_web2py.sh


o segundo passo é instalar o php:

#apt-get install. libapache2-mod-php5


(e outras dependências que quiser)


O último passo é incluir um novo virtualhost no apache. (

a) crie um arquivo com o nome do seu domínio/subdomínio e coloque em /etc/apache2/sites-enabled:

b) coloque o conteúdo abaixo, alterando apenas o servername :

-------------------------------------------

<VirtualHost *:80>
ServerName php.mydomain.com
#ServerAlias


ServerAdmin webmaster@localhost

DocumentRoot /var/www
<Directory />
Options FollowSymLinks
AllowOverride None
</Directory>
<Directory /var/www/>
Options Indexes FollowSymLinks MultiViews
AllowOverride None
Order allow,deny
allow from all
</Directory>

ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
<Directory "/usr/lib/cgi-bin">
AllowOverride None
Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
Order allow,deny
Allow from all
</Directory>

ErrorLog /var/log/apache2/error.log

# Possible values include: debug, info, notice, warn, error, crit,
# alert, emerg.
LogLevel warn

CustomLog /var/log/apache2/access.log combined

Alias /doc/ "/usr/share/doc/"
<Directory "/usr/share/doc/">
Options Indexes MultiViews FollowSymLinks
AllowOverride None
Order deny,allow
Deny from all
Allow from 127.0.0.0/255.0.0.0 ::1/128
</Directory>

</VirtualHost>
---------------------------------------------------------------------------------

É só reiniciar o apache e pronto:

# sudo service apache2 restart


--
Atenciosamente

--
=========================
Alexandre Andrade
Hipercenter.com

quarta-feira, janeiro 27, 2010

Scaffolding para Code Igniter

Estou pensando em usar Code Igniter como base nos novos projetos que tiver que fazer em php, embora minha preferência pelo web2py/python, e a notícia de um scaffolding para o CI me interessou:

http://blog.relaxos.com.br/php/ci-scaffold-gerador-de-crud-para-code-igniter/

O link para baixar o scaffold é

http://code.google.com/p/ci-scaffold/

--
Atenciosamente

--
=========================
Alexandre Andrade
Hipercenter.com

segunda-feira, janeiro 11, 2010

sexta-feira, janeiro 08, 2010

Raspagem de dados

Um interessante artigo sobre raspagem de dados, algo que mais cedo ou mais tarde todos precisaremos.
Afinal, de certa forma já usamos, porque qualquer buscador da web (leia-se google, bing, yahoo) utiliza-se deste recurso.

http://imasters.uol.com.br/artigo/15447/bancodedados/raspagem_de_dados/


--
Atenciosamente

--
=========================
Alexandre Andrade
Hipercenter.com

sábado, janeiro 02, 2010

Novo RG: cadastro deve começar em janeiro

Fonte: http://pcworld.uol.com.br/noticias/2009/12/30/novo-rg-cadastro-deve-comecar-em-janeiro/

Documento terá microchip e dados gravados a laser. Um dos objetivos do governo é evitar falsificações.

O ano de 2010 deve começar com mudanças nos documentos dos brasileiros. O Instituto Nacional de Identificação (INI), órgão ligado à Polícia Federal, espera que nos próximos dias seja publicado o decreto para implementação do novo Registro de Identidade Civil (RIC).

O documento vai reunir os números de todos os documentos de registro dos cidadãos, como CPF, Carteira de Trabalho, Carteira Nacional de Habilitação e Título de Eleitor – além do Registro Geral. Com a publicação do decreto, a expectativa é de que o cadastro para a emissão das novas carteiras de identidade comece em janeiro.

Ao solicitar o RIC, o cidadão passará pelos procedimentos habituais para obter a carteira de identidade, com coleta de digitais, fornecimento de dados pessoais e assinatura. A diferença, segundo a Polícia Federal, é que o processo será totalmente informatizado, garantindo um cadastro nacional biométrico.

O novo cartão terá um sistema complexo de tecnologia que inclui microchip e dados gravados a laser no documento. O objetivo é evitar falsificações e permitir maior agilidade na transmissão de dados sobre uma pessoa em todo o território nacional. Os órgãos regionais deverão receber estações de coleta e transferir os dados para o órgão central em Brasília, que por sua vez emitirá a nova identidade.

Espera-se que a partir do terceiro ano de implementação do projeto 80 mil pessoas possam ser cadastradas por dia, alcançando a meta de 20 milhões de cidadãos por ano. Em nove anos, cerca de 150 milhões de brasileiros devem ter o novo RIC.

--
Atenciosamente

--
=========================
Alexandre Andrade
Hipercenter.com