quarta-feira, junho 07, 2017

Plano de Governo Brasil 2019-2022

Este post é um exercício. Está sujeito a ajustes no período.

a) Contexto

O Brasil tem mais de 200 milhões de habitantes, IDH 0,754 (79 no ranking), R$ 6,266 trilhões em 2016, PIB per capita ficou em R$ 30.407 – uma redução de 4,4%. O indice de Gini — chegou a 0,5229 no ano passado, alta de 1,6% em relação ao ano anterior. A taxa de desemprego chegou a 13,7% no primeiro trimestre de 2017. 

b) Propostas 

Ajuste das finanças públicas: 
1) Eliminação da remuneração do depósito compulsório que os bancos fazem ao Banco Central
ver http://www.valor.com.br/financas/2525808/remuneracao-sobre-compulsorio-de-deposito-prazo-caira-mais-devagar
A eliminação dessa remuneração deve destravar mais de 300 bilhões de reais anuais ao orçamento público federal, a serem alocadas nas prioridades abaixo:

2)  Desenvolvimento local

A fim de reduzir o desemprego e a desigualdade, devem ser identificados os 'bolsões de miséria', bairros e regiões com alto desemprego e baixa renda, e fornecidos empréstimos e serviços públicos para que em um raio de 2 km cada cidadão tenha escola, posto de saúde, comércio, lazer, serviços e trabalho. 




quarta-feira, maio 17, 2017

Reconhecendo texto em um pdf scaneado com python e tesseract


Como converter um arquivo pdf scaneado em um arquivo pdf que permita a busca pelo texto?

As orientações são para o ubuntu 16.04

1) Instale o pypdfocr

sudo pip install pypdfocr

2) instale o tesseract e o language pack

sudo apt install tesseract-ocr tesseract-por

3) para converter um arquivo

pypdfocr -l por scaneado.pdf

irá gerar um arquivo scaneado_ocr.pdf.


Para mais opções, consulte a documentação em

http://virantha.github.io/pypdfocr/html/ 

---------------------------------------------------------------------------------------
Para instalação no Centos 7, siga as orientações de

http://www.keienberg.com/install-tesseract-3-04-centos-7/

Se reclamar 'leptonic not found' no passo 3, use:

$ setenv LIBLEPT_HEADERSDIR /usr/local/include/leptonica ; setenv LDFLAGS -L/usr/lib ; ./configure --prefix=/usr

make install e ldconfig devem ser executados como

sudo make install
sudo ldconfig

no passo 5, faça

export TESSDATA_PREFIX=/usr/share/tessdata

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

Versão corrigida

Tesseract installation is supported beautifully with Ubuntu, but with Centos it requires effort to build. Below is a description of how to install Tesseract on CentOs.
Used versions:
Tesseract: 3.04.01 tesseract-3.04.01.tar.gz
Leptonica: 1.73 leptonica-1.73.tar.gz
Tesseract-ocr 3.02 tesseract-ocr-3.02.deu.tar.gz, tesseract-ocr-3.02.eng.tar.gz, tesseract-ocr-3.02.nld.tar.gz, tesseract-ocr-3.02.por.tar.gz
GhostScript: Install Tesseract 3.04 on CentOs 7

I executed all commands as root, but if you prefer, you can use another account and ‘sudo‘ the commands

1) First update your system:
yum update
Because Tesseract-ocr is not available using yum, we need to download source and build both Tesseract-ocr and leptonica.
This requires development tools to be installed.
yum groupinstall “Development Tools”

Se der erro use:.

yum groupinstall "Ferramentas de desenvolvimento"

yum -y install automake autoconf libtool zlib-devel libjpeg-devel giflib libtiff-devel libwebp libwebp-devel libicu-devel openjpeg-devel cairo-devel

2) Now download and install Leptonica :
wget http://www.leptonica.com/source/leptonica-1.73.tar.gz
tar xzvf leptonica-1.73.tar.gz
cd leptonica-1.73
./configure
make 
make install 

3) Download and install Tesseract:
wget https://github.com/tesseract-ocr/tesseract/archive/3.04.01.tar.gz
mv 3.04.01.tar.gz tesseract-3.04.01.tar.gz
tar xzvf tesseract-3.04.01.tar.gz
cd tesseract-3.04.01/
./autogen.sh
setenv LIBLEPT_HEADERSDIR /usr/local/include/leptonica ; setenv LDFLAGS -L/usr/lib ; ./configure --prefix=/usr
./configure
make
make install
ldconfig

make training
make training-install
 


4) Download and install Tesseract trainer files:
wget https://sourceforge.net/projects/tesseract-ocr-alt/files/tesseract-ocr-3.02.eng.tar.gz
wget https://sourceforge.net/projects/tesseract-ocr-alt/files/tesseract-ocr-3.02.nld.tar.gz
wget https://sourceforge.net/projects/tesseract-ocr-alt/files/tesseract-ocr-3.02.deu.tar.gz
wget https://sourceforge.net/projects/tesseract-ocr-alt/files/tesseract-ocr-3.02.por.tar.gz
tar xzvf tesseract-ocr-3.02.eng.tar.gz
tar xzvf tesseract-ocr-3.02.nld.tar.gz
tar xzvf tesseract-ocr-3.02.deu.tar.gz
tar xzvf tesseract-ocr-3.02.por.tar.gz

cp -r tesseract-ocr/tessdata/ /usr/share/
 

 
5) Export TESSDATA_PREFIX:
export TESSDATA_PREFIX=/usr/share/tessdata
6) Last, install Ghostscript for processing png:

wget https://github.com/ArtifexSoftware/ghostpdl-downloads/releases/download/gs920/ghostscript-9.20.tar.gz

tar xzvf ghostscript-9.20.tar.gz

cd ghostscript-9.20/
./autogen.sh
./configure
make
make install

if tesseract complains about not find liblept.so.5 , do:

 ln -s /usr/local/lib/liblept.so.5 /usr/lib64/






quinta-feira, abril 06, 2017

Iniciando com NLTK


Para instalar:


pip3 install nltk


Para instalar os pacotes adicionais, o NLTK tem uma lógica expecial, é preciso usar o prompt do python:

python3

import nltk
nltk.download()

Se tem espaço bastante, simplemente configure o diretório padrão para /usr/share/nltk (ou o seu venv) e download 'all'

Páginas interessantes:

https://www.ibm.com/developerworks/br/library/os-pythonnltk/
NLTK Book

 



sexta-feira, março 31, 2017

Melhores Sites de ciclismo



 Internacionais
  1.  http://www.steephill.tv/ - A melhor cobertura da elite do ciclismo mundial
  2. http://www.cycling.tv/ - Pena que só nos EUA (snif, snif) - videos de corrida ao vivo e on demand
  3. http://www.cyclingnews.com/  - Site com boas matérias sobre ciclismo
  4. http://www.cyclingweekly.com/ - Site inglês
  5. http://tiz-cycling.racing/live-stream/  transmissão ao vivo
Nacionais

  1.  www.bikemagazine.com.br
  2. www.pedal.com.br
  3. www.fmc.org.br - Federação Mineira

Se discordar ou tiver uma contribuição, deixe seu comentário abaixo!

quinta-feira, março 30, 2017

Vivaldi - Navegador


o Vivaldi (vivaldi.com) é um navegador desenvolvido por uma equipe dissidente do Ópera.
O que acho legal nele é mostrar número e o tamanho dos arquivos da página que está baixando.
Sempre fico surpreso com o tamanho das páginas!

Como imprimir uma página direto do browser


No Firefox você pode fazer algumas modificações que permitem imprimir um documento sem o prompt de confirmação da seguinte forma:
  • Digite about:config para entrar na aba de configurações (clique em "serei cuidadoso, prometo") e prossiga.
  • Crie uma nova preferência do tipo booleano. Dê o nome de print.always_print_silent e marque-a como true.
Ao reiniciar o navegador, qualquer chamada via Javascript com código window.print() iniciará a impressão automaticamente. Assim, até mesmo um link como o abaixo funcionará:
<a href='javascript:window.print()'>Imprimir essa página</a>
Mas como pode ver de qualquer maneira é necessária a permissão por parte do usuário.

ps: Caso tenha feito o teste acima, não esqueça de entrar novamente na aba de preferências do Firefox e alterar a chave print.always_print_silent para false (ou então clicar em "restaurar o padrão"). 

Referência:

http://pt.stackoverflow.com/questions/54858/como-imprimir-uma-p%C3%A1gina-diretamente-sem-caixa-de-di%C3%A1logo-do-navegador-usando
 

Web2py ERROR', 'relation "auth_user" already exists

É comum ocorrerem errors de migração no DAL do web2py. Seja porque foi feito um restore diretamente via banco de dados, alguma alteração direta no banco, ou outro motivo.


Se a instalação é nova, e o banco foi criado/restaurado a partir de um backup, normalmente basta alterar as linhas no arquivo db.py de :

    db = DAL(myconf.get('db.uri'),
             pool_size=myconf.get('db.pool_size'),
              migrate=True,
             check_reserved=['all'])


para:

    db = DAL(myconf.get('db.uri'),
             pool_size=myconf.get('db.pool_size'),
              fake_migrate_all=True,
              #migrate=True,
             check_reserved=['all'])


Faça essa alteração, rode uma vez, e volte para o padrão.

Ao deixar o fake_migrate ativado,  ao se criar um novo campo ou tabela no web2py, ela não é criada no banco, levando o banco de dados informar o erro que o campo ou tabela não existe.

Nesse caso, é preciso fazer a alteração diretamente no banco de dados. O arquivo databases/sql.log pode ajudar com o sql que 'deveria' ter sido aplicado no banco, mas foi 'fake'.  Em alguns casos mais complexos, os erros tem que ser corrigidos à mão.

Portanto, via de regra, não deixe o fake_migrate_all ativo por padrão.


Como alterar a senha de um usuario no Postgresql

Quando se instala o Postgresql, normalmente é necessário alterar a senha do usuário no banco por segurança.


Para isso, siga 3 passos:


1. Assuma o usuário root

su

2.  Assuma o usuário postgres

su postgres

3. Entre no psql e digite o comando a seguir:

psql

ALTER USER postgres WITH PASSWORD '';

Como instalar o desktop MATE no Ubuntu



Para instalar/atualizar o desktop MATE no Ubuntu 16.04:


sudo apt-add-repository ppa:ubuntu-mate-dev/xenial-mate
sudo apt-get update
sudo apt-get install mate 

Usando ssh key para autenticar em seu servidor

Esse post mostra como criar uma chave no seu computador (linux) e exportá-la para seu servidor para para autenticar sem usar senha

1. Crie a chave. Aceite os padrões ou altere, se preferir


ssh-keygen

2. Exporte a chave. Será preciso entrar com a senha do usuário do servidor desta vez:


ssh-copy-id username@remote_host
 
 


3. Se precisar colar a chave em algum site (Digital Ocean, Bitbucket, e outros) , use o comando abaixo para exibir a chave. Copie o resultado e cole no campo apropriado:

cat ~/.ssh/id_rsa.pub
 
ou 
 
cat ~/.ssh/id_rsa.pub | xclip -sel clip
 
(se tiver o xclip instalado)
 
 

Instalar desktop Pantheon no Ubuntu 16.04

O Pantheon é o Desktop do ElementaryOS.

Para instalá-lo no Ubuntu, use os seguintes comandos:


sudo add-apt-repository ppa:elementary-os/stable
sudo apt-get update
sudo apt-get install elementary-desktop
 
Experimentei um pouco e confesso que não gostei, ainda prefiro o MATE
 
 
 
 

quarta-feira, abril 01, 2015

domingo, setembro 14, 2014

Dicas para sua vida profissional

1-Pense em algo que é importante para as pessoas e que você se veria capaz de fazer.
2-Procure saber um pouco mais das tarefas da profissão e imagine se você gostaria de realizá-las.
3-Procure saber se a remuneração média dessa profissão atende a qualidade de vida que você pretende ter.
4-Entenda que a escolha de uma profissão não é definitiva e que você pode mudar ao longo da vida.
5-Como dica de carreira, sempre procure deixar uma boa impressão em seus empregos, pois eles poderão servir de referência para novas oportunidades.
6-Procure fazer seu trabalho pensando como se você fosse o dono do negócio, isso lhe abrirá muitas portas para o crescimento profissional.
7-Você deve estar sempre se atualizando sobre sua profissão.
8-Pense sempre que você tem que conciliar a sua dedicação ao trabalho com seu lazer; sua família e amigos.

quinta-feira, setembro 26, 2013

a teoria do criacionismo ou a tradução da palavra nada

Até data recente, havia em mim a dúvida se Deus existe ou não. Em outros termos, um agnóstico.

Colocando na balança que mesmo a melhor teoria científica chega a conclusão de que houve um momento que toda a matéria esteve concentrada em um ponto e 'explodiu', a partir daí, e que este ponto deveria ter toda a matéria existente, e que numa fração de segundo anterior este ponto sequer existisse, só pode-se chegar a conclusão de que o nada criou o primeiro ponto e a partir daí houve um crescimento do universo.

Humberto Gessinger, em uma das suas músicas, afirma que 'nada é uma palavra esperando tradução'.

Pois para mim, 'nada = Deus".

Quando ninguém pode ajudar, do nada pode surgir ajuda, se sua fé e força de vontade forem fortes o bastante.

Pois o nada criou o ponto, e a partir daí, foi possível criar todas as outras coisas.


terça-feira, maio 21, 2013

cursos de programação gratuitos (em inglês)


Procurando no udemy, que tem muitos cursos gratuitos e pagos, encontrei um curso de c gratuito, que parece de boa qualidade..


No curso, descobri que o professor mantinha um site com vários cursos gratuitos:

http://itube.igneustech.com/list-courses.igneustech/9

terça-feira, março 19, 2013

IS_CEP validator para web2py

Inclua o código abaixo em um model, no início do arquivo db.py em um arquivo que em ordem alfabética seja anterior a db.py. Eu uso 0_validators.py

Para usar, use como um validator comum, na definição da tabela

...
Field('cep', requires=IS_CEP()),
...

ou após a definição:

db.mytable.cep.requires = IS_CEP()


class IS_CEP(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) == 8:
                cep = cl
                return(str(cep),None)
            else:
                return (value, 'Número de dígitos incorreto para CEP')

        except:
            return (value, 'algum erro'+str(value))
    def formatter(self, value):
        formatado = value[0:2]+'.'+value[2:5]+'-'+value[5:8]
        return formatado

Melhor IDE ou Editor para Python

Essa é uma pergunta que a maior parte dos programadores python não gosta de responder.

Dizem que você deve experimentar e escolher o que é melhor para você.

Eu fiz isso.

Dos pagos, gostei do WingIDE (versão trial). Rápido, confiável, multiplataforma.

O Komodo ficaria em segundo lugar, porque é mais lento. 

Dos gratuitos, a maioria são instáveis ou lentos, ou tem usabilidade ruim. Tão ruim que às vezes preferia um editor de texto como o Notepad++ no windows ou o Gedit no linux.

Mas existe uma luz no fim do túnel. O Aptana 3 apresenta muitas qualidades sem o defeito de ser pago.

Portanto, minha resposta para a pergunta acima é: Aptana Studio 3.
Ele é baseado no pydev, só que é fácil de instalar.

Para baixá-lo, vá a http://www.aptana.com/products/studio3


Atualização em março de 2017:

Hoje, fico longe dos editores acima. A melhor IDE seria a PyCharm, mesmo a Comunity Edition já tem muitas qualidades. Mas por ser em java, é pesada.

Na prática, adotei o Sublime Text 3. É leve e supre todas necessidades de um programador. Não tem todas as funcionalidades de uma IDE, mas se vocẽ conhece bem as bibliotecas/frameworks que trabalha e o seu código, é mais que suficiente. Se não, talvez seja melhor gastar um tempo estudando a documentação do framework ou biblioteca do que contar com a ajuda da IDE.








quinta-feira, fevereiro 14, 2013

Postgresql, mysql databases smallest footprint

short answer: Postgresql

Detailled answer:

Postgresql 36 MB
Mysql 134MB

If you have a small vps, or your dev PC/Laptop haven't much memory, choose Postgresql.




--
Atenciosamente


Alexandre Andrade

sexta-feira, agosto 10, 2012

Roteiro prático para resolução de bugs


Segue procedimentos básicos na resolução dos bugs:

    1  Execute o procedimento descrito que gera o problema

Se há mensagens de erro 
  1.        Verifique as mensagens de erro informadas 
  2.        Busque na internet (Google) referencias e a documentação do framework/linguagem/sistema operacional a erros similiares.  
  3.        Se o erro já tiver solução, avalie se a solução aplica ao seu caso 
  4.      Se a solução da internet não resolver o problema,siga o roteiro abaixo:


Se não há mensagens de erro:
1.       Ative ou aumente o nível de mensagens de erro do framework/linguagem de programação, ou utilize um debugger (xdebug)
2.       Se ainda assim não gerar nenhuma mensagem de erro,  analise o código e insira pontos de interrupção no código para identificar até onde o código funciona corretamente.
3.       Se a interrupção ocorrer na chamada de uma classe ou função, inclua pontos de interrupção no código de declaração da classe ou função, para identificar até onde o código funciona corretamente


Uma vez identificado o ponto de erro, avalie suas causas, e aplique a solução.


Erros mais comuns:
Valores não tratados (Ex: texto onde deveria ser número) -> inclua código para tratar os valores antes de utilizá-los
Tipagem errada (a variável é uma string mas deveria ser número) -> providencie a conversão
Permissões: alguma configuração do framework, linguagem ou sistema operacional não está adequada -> identifique a configuração errada, consulte a documentação, e providencie a configuração correta
Bibliotecas não existentes ou antigas - > providencie a instalação/atualização.
Consultas SQL erradas -> avalie o que a consulta deveria realmente fazer e providencie as correções necessárias
Modelagem errada do banco -> providencie a adequação da modelagem à solução do problema

segunda-feira, janeiro 30, 2012

como fazer mascara em campos - passo a passo

De

Flavio Lichtenstein flalix@gmail.com para a lista web2py users brasil:
 

Ola pessoal, consegui fazer as máscaras de CEP, Telefone, etc dentro do Web2Py. A seguir vai a "receita de bolo":

1) adicionar código em web2py_ajax.html
response.files.insert(3,URL(r=request,c='static',f='js/jquery.maskedinput-1.3.min.js'))

cuidado! o número três é porque já havia as referencias 0,1 e2 - cuiado para sequenciar corretamente
2) no final da(s) página(s) onde está seu código - normalmente default\minha_pagina.html, adicionar os filtros necessários como vistos abaixo - adeque à sua realidade:

 
         

   a) "pessoa" é nome da sua tabela
   b) maskMoney() não é necessário só para quem usar $$$

3) adicionar o JS de mascara em static\js - ver no final deste email 

4) em _utils (ou rotina inicial que adotar) colocar a classe que Bruno enviou --> repare que alterei  para funcionar "no meu código" (Bruno, obrigado por ter enviado e alertado)

# do Bruno Rocha em 23/01/2012
class REMOVE_MASK(object):
    def __init__(self, symbols=["_",".","-","/",")","("," "]):
        # print 'symbols', symbols
        self.symbols = symbols

    def __call__(self, value):
            for symbol in self.symbols:
                value = value.replace(symbol, "")
                # print 'value',value
                # print 'symbol', symbol
            return (value, None)

5) nas definições do(s) campo(s) da(s) tabela(s) onde ocorrerem a máscara deve-se adicionar  "REMOVE_MASK" (como alertou Bruno) de forma que os caracteres sejem removidos "antes do post"

exemplo:

SQLField('cpf','string', length=11, unique=True, label="CPF", \
                comment="cadastro de pessoa física", requires=REMOVE_MASK([".", "-"])),

---------------------------------------------------------------------------------------------------------
--- JS - em static\js --> adicionar:  jquery.maskedinput-1.3.min.js --> js da digitalbush
como enviado pela Relsi, veja o email anterior dela, onde pode-se ver um exemplo com html puro - não em Web2py (obrigado Relsi).

---------------------------------------------------------------------------------------------------------
/*
    Masked Input plugin for jQuery
    Copyright (c) 2007-2011 Josh Bush (digitalbush.com)
    Licensed under the MIT license (http://digitalbush.com/projects/masked-input-plugin/#license
    Version: 1.3
*/
(function(a){var b=(a.browser.msie?"paste":"input")+".mask",c=window.orientation!=undefined;a.mask={definitions:{9:"[0-9]",a:"[A-Za-z]","*":"[A-Za-z0-9]"},dataName:"rawMaskFn"},a.fn.extend({caret:function(a,b){if(this.length!=0){if(typeof a=="number"){b=typeof b=="number"?b:a;return this.each(function(){if(this.setSelectionRange)this.setSelectionRange(a,b);else if(this.createTextRange){var c=this.createTextRange();c.collapse(!0),c.moveEnd("character",b),c.moveStart("character",a),c.select()}})}if(this[0].setSelectionRange)a=this[0].selectionStart,b=this[0].selectionEnd;else if(document.selection&&document.selection.createRange){var c=document.selection.createRange();a=0-c.duplicate().moveStart("character",-1e5),b=a+c.text.length}return{begin:a,end:b}}},unmask:function(){return this.trigger("unmask")},mask:function(d,e){if(!d&&this.length>0){var f=a(this[0]);return f.data(a.mask.dataName)()}e=a.extend({placeholder:"_",completed:null},e);var g=a.mask.definitions,h=[],i=d.length,j=null,k=d.length;a.each(d.split(""),function(a,b){b=="?"?(k--,i=a):g[b]?(h.push(new RegExp(g[b])),j==null&&(j=h.length-1)):h.push(null)});return this.trigger("unmask").each(function(){function v(a){var b=f.val(),c=-1;for(var d=0,g=0;de.placeholder;while(g++length){var m=b.charAt(g-1);if(h[d].test(m)){l[d]=m,c=d;break}}if(g>b.length)break}else l[d]==b.charAt(g)&&d!=i&&(g++,c=d);if(!a&&c+10,k);else if(a||c+1>=i)u(),a||f.val(f.val().substring(0,c+1));return i?d:j}function u(){return f.val(l.join("")).val()}function t(a,b){for(var c=a;ce.placeholder)}function s(a){var b=a.which,c=f.caret();if(a.ctrlKey||a.altKey||a.metaKey||b<32)return!0;if(b){c.end-c.begin!=0&&(t(c.begin,c.end),p(c.begin,c.end-1));var d=n(c.begin-1);if(dd].test(g)){q(d),l[d]=g,u();var i=n(d);f.caret(i),e.completed&&i>=k&&e.completed.call(f)}}return!1}}function r(a){var b=a.which;if(b==8||b==46||c&&b==127){var d=f.caret(),e=d.begin,g=d.end;g-e==0&&(e=b!=46?o(e):g=n(e-1),g=b==46?n(g):g),t(e,g),p(e,g-1);return!1}if(b==27){f.val(m),f.caret(0,v());return!1}}function q(a){for(var b=a,c=e.placeholder;bif(h[b]){var d=n(b),f=l[b];l[b]=c;if(dh[d].test(f))c=f;else break}}function p(a,b){if(!(a<0)){for(var c=a,d=n(b);cif(dl[d],l[d]=e.placeholder;else break;d=n(d)}u(),f.caret(Math.max(j,a))}}function o(a){while(--a>=0&&!h[a]);return a}function n(a){while(++a<=k&&!h[a]);return a}var f=a(this),l=a.map(d.split(""),function(a,b){if(a!="?")return g[a]?e.placeholder:a}),m=f.val();f.data(a.mask.dataName,function(){return a.map(l,function(a,b){return h[b]&&a!=e.placeholder?a:null}).join("")}),f.attr("readonly")||f.one("unmask",function(){f.unbind(".mask").removeData(a.mask.dataName)}).bind("focus.mask",function(){m=f.val();var b=v();u();var c=function(){b==d.length?f.caret(0,b):f.caret(b)};(a.browser.msie?c:function(){setTimeout(c,0)})()}).bind("blur.mask",function(){v(),f.val()!=m&&f.change()}).bind("keydown.mask",r).bind("keypress.mask",s).bind(b,function(){setTimeout(function(){f.caret(v(!0))},0)}),v()})}})})(jQuery)