sexta-feira, 9 de junho de 2017

Subtle Bug: Python, Mac and Unicode

I was studying Django by doing a project. Every test was passing so apparently everything was fine. But after deploying the application and trying to save a subscription I got a 404.

I little investigation revealed that Django's template tag url was generating "/inscricao/ˆ" instead of expected "/inscricao/". So I triple checked my urls. First the my base urls.py:


And after my app urls:


Everything looked nice. So I thought: "Maybe I found a bug on Django, what a chance to contribute to a huge Python web framework!". So I wrote a test case on my application to uncover the bug and started debugging it. The test could be used latter to send a PR to Django:


So the failing test helped me to find the line where "^" is removed from pattern to build the paths:


On debugger session my p_pattern was "'ˆ$". Besides of that the conditions was returning False. I thought: WTF!. But keeping attention I spotted the issue.

The "ˆ" from my code was a bit smaller the "^" on DJango's code. The issue happens because when you configure Mac's Keyboard to international and you press SHIFT + ^ you get "ˆ". Most of times Brazilians type a letter after that so you have char like "ê" or "â". In this case If you really want only the circumflex accent you need hit space button on your keyword.

On other systems, like Linux and Windows, you get no char when typing this button, so you are visually aware that you need to take another action to make it appear. That is the reason I got the wrong char there.

I could also have spotted that paying attention to Pycharm IDE sintax highlight. On raw strings mostly used for regex it color special char with orange. Check the difference:


Wrong char

Right char

After all of this I also checked the names of the chars using python:


And off course, fixed it:

https://github.com/renzon/wttd/commit/0aebc0fbb9ff8a6ef9c38ea4215c278653404bb3

So after been a little angry for spending 2 hours at this bug I decided to write this blog post to realize the things I learned on investigation:
  1. unicode;
  2. regex;
  3. more knowledge about Django's internal code;
  4. knowing "^" char is called circumflex accent in English.

Most of times when I find myself struggling with a bug the cause was a simple (and mine) mistake which led to it. And you? Do you have a history with a bug like this? Share on the comments!

And off course, fixed it:

https://github.com/renzon/wttd/commit/0aebc0fbb9ff8a6ef9c38ea4215c278653404bb3

So after been a little angry for spending 2 hours at this bug I decided to write this blog post to realize the things I learned on investigation:
  1. unicode;
  2. regex;
  3. more knowledge about Django's internal code;
  4. knowing "^" char is called circumflex accent in English.

Most of times when I find myself struggling with a bug the cause was a simple (and mine) mistake which led to it. And you? Do you have a history with a bug like this? Share on the comments!

segunda-feira, 4 de julho de 2016

7 razões para cachorros serem felizes

Há 7 anos minha esposa ganhou uma cachorra Beagle e a batizou de Fiona.

Nos casamos em 2015 ela me perguntou se podia levar a Fiona. A priori fui contra, por que nunca tive paciência para cuidar de animais. Mas como quem pode manda e quem é esperto obedece, a Fiona veio morar com a gente. E não demorou muito para essa danadinha conquistar meu coração.
Infelizmente hoje, dia 4 julho, a Fiona nos deixou. Por isso escrevo esse texto em homenagem a ela.
Sempre reparei que a Fiona estava sempre feliz. Como o assunto me interessa muito, compartilho aqui minhas observações:
  1. Cachorros são hedonistas. Ou seja, eles vivem o presente intensamente. A Fiona estava sempre pronta para passear. Não podia nos ver mastigando que já fazia cara de coitada para ganhar uma comida diferente.
  2. Cachorros precisam de pouco. Água, comida e carinho são suficiente para ele ficar contente. Acrescentava uma bolinha para brincadeiras, a Fiona ficava no Nirvana. E uma bolinha de meia? Ficava feliz da vida mastigando na casinha. Já ouviu o ditado "Pobre não é quem não tem nada, mas sim quem precisa de tudo"? Quem mais vive isso tão intensamente?
  3. Cachorros demonstram seus sentimentos. Ela só olhar o rabo dela e carinha que vc sabia se ela estava triste, contente ou abatida. Cachorro, se não gosta de você, rosna e late. Mas Fiona nunca rosnava ou mordia, mesmo quando eu abria a boca dela para escovar os dentes ou para ingerir os remédios contra convulsão.
  4. Cachorro não tem pena de si mesmo. Quando descobrimos que a Fiona estava com metástase, ela não ficou abatida ou reclamando. Viveu mais 3 meses aproveitando a vida, ficando quieta nos dias ruins, mas brincando e correndo junto comigo pelo mato ,perto de casa, nos dias bons.
  5. Cachorros não guardam rancor. Mesmo depois de levarem uma baita bronca por conta de terem feito bagunça, basta chamar que ela vinha para mais uma brincadeira com pano.
  6. Cachorros amam intensamente. Chegou em casa, lá estava ela abando o rabo, querendo brincar e passear.
  7. Cachorros não julgam. Acho que o texto do livro Marley e Eu traduz a idéia melhor do que eu poderia: "Para um cão, você não precisa de carrões, de grandes casas ou roupas de marca. Símbolos de status não significavam nada para ele. Um pedaço de madeira já está ótimo. Um cachorro não se importa se você é rico ou pobre, inteligente ou idiota, esperto ou burro. Um cão não julga os outros por sua cor, credo ou classe, mas por quem são por dentro. Dê seu coração a ele, e ele lhe dará o dele. É realmente muito simples, mas, mesmo assim, nós humanos, tão mais sábios e sofisticados, sempre tivemos problemas para descobrir o que realmente importa ou não. De quantas pessoas você pode falar isso? Quantas pessoas fazem você se sentir raro, puro e especial? Quantas pessoas fazem você se sentir extraordinário?"
Enfim, termino esse texto feliz por você ter feito parte da minha vida em vez de triste por ter partido. Sou muito mais "cachorro" depois desses 8 meses maravilhosos. Sempre lembrarei de você quando estiver correndo pelo bairro, mas agora sem companhia. Obrigado.



quarta-feira, 24 de fevereiro de 2016

Hackeando custos no início de sua empresa: a história que contador não conta

Vou dividir o post em duas partes.  Na primeira falarei sobre a abertura da empresa. Na  segunda focarei em minimizar alguns custos iniciais.  Mas antes de abordar esses assuntos a questão importante é: o que chamo de empresa?

A definição simplista que já ouvi e gostei é de que empresa é um papel que te dá acesso ao CNPJ.  Com ele será possível abrir contas e receber pagamentos.  Ele também permitirá desfrutar da cobrança de impostos mais favorável que a da pessoa física. Sendo então a economia a principal motivação cortar custos, principalmente no início, é muito importante.

o primeiro passo então é aprender como abrir a companhia.  A primeira resposta que ouvirá será procurar um profissional conhecido como contador.  Ele conhece o emaranhado de leis brasileiras (pelo menos deveria) e atalhos para atingir esse objetivo.  Te ajuda a escolher o enquadramento da sua empresa buscando minimizar o pagamento de impostos de forma legal. Contudo seus serviços possuem um custo e é do interesse dele tê-lo como cliente.

Por essa razão pode ser que não mencione a modalidade de empresa chamada Micro Empreendedor Individual (MEI). Raramente elogio iniciativas do governo mas essa realmente é uma que deu certo.  nessa modalidade você obtém o seu CNPJ preenchendo um formulário pela internet em cerca de 10 minutos. O cadastro é simples e assim você já economiza o custo de abertura de uma empresa.

Com o cartão do Empreendedor em mãos você precisará apenas da ajuda do computador para tirar a Inscrição Municipal e respectivo alvará.  Em minha cidade isso custou R$ 110.

Mas essa não é a principal economia.  A tributação e obrigações  desse tipo de pessoa jurídica são muito simples, de tal forma que você mesmo poderá fazer a contabilidade.  Considerando um custo mensal de R$ 250 pelo contador,  você economizará R$ 3000 por ano! Acredito ainda está cotando um valor abaixo da média do mercado ;).

O imposto mensal é fixo, atualmente no valor de R$ 49,  desde que você fature até R$ 60.000 anuais.  As guias de pagamento ficam disponíveis no site. Você pode pagar em qualquer banco ou pela internet.

As obrigações são duas.  Você deve gerar um documento com todas entradas e saídas a cada mês.  Convenhamos Isso já é algo que você deveria fazer ao pensar em abrir uma empresa. A segunda obrigação é declarar o faturamento de sua empresa à Receita Federal anualmente.  Isso é feito pela internet em menos de 5 minutos.  Outra peculiaridade é que a obrigação de emissão de nota fiscal só existe se o seu serviço for prestado a outra pessoa jurídica.  Para pessoas físicas a nota é opcional.

Dessa maneira, você já consegue economia considerável.  Mas ainda é possível cortar outros custos.

Depois de obter o meu CNPJ percebi que vários fornecedores querem tirar uma casquinha do meu faturamento.  O primeiro deles foi a empresa NET.  Ao orçar o serviço de internet  recebi o valor de R$ 250 para instalação e mensalidades de R$ 129. Cotando então o serviço para em nome de minha mãe, pessoa física, o custo ficou em R$ 69,  sem taxa de instalação. Economia de R$ 720 anuais.

A extorsão não parou aqui. No PythonPro utilizo o PagSeguro para receber os pagamentos.  cadastrada a minha empresa os recursos só podem ser transferidos para uma conta bancária da respectiva pessoa jurídica.  Como só utilizaria para receber esse dinheiro procurei nos principais bancos por uma conta sem custo de manutenção. Descobri que essa opção não existe. 

Passei então a conviver  com as cobranças da Caixa Econômica Federal.  Eram R$ 29 pela cesta de serviços mais simples e outros R$ 29,50  de taxa de manutenção todo mês.  Em minha visão se já pago cesta já deveria estar inclusa manutenção.

Por conta disso fui conversar com o gerente, ver se havia alguma forma de isenção de taxas. já possuía conta há mais de um ano. Dado esse tempo é a movimentação financeira achei que conseguiria algo, pois obtive isenção integral em minha conta de pessoa física com essa estratégia.  Ledo engano,  não consegui sequer um pequeno desconto. Fiquei decepcionado e isso inclusive me motivou a escrever esse post =P.

Contudo a solução acabou aparecendo.  O PagSeguro criou um cartão de crédito pré pago. A vantagem é que posso transferir os recursos do site direto para ele.  Inclusive o processo demora muito menos que a movimentação para o banco. Sendo assim foi possível encerrar a conta na Caixa e economizar outros R$ 714 anuais. Somando valores,  consegui economizar R$ 4.434 por ano. Comparado ao faturamento máximo do microempreendedor de R$ 60.000, isso  representa 7.39%.

Se você, assim como eu,  puder se enquadrar nas categorias de microempreendedor individual e sua fonte exclusiva de pagamento for à internet, poderá fazer o mesmo. Vamos protestar hackeando o sistema, eliminando fornecedores cujo custo benefício são ridículos.

Mas e você conhece outras formas de economizar?  Compartilhe seus hacks para me ajudar a economizar ainda mais =D.

terça-feira, 5 de janeiro de 2016

Fórmula para escrever redações e dissertações

Minha motivação para escrever esse texto é a dificuldade que observei e observo em Trabalhos de Conclusão de Curso (TCC). Dou aula na Fatec de São José dos Campos e a questão fica latente nas apresentações feitas nas bancas de correção no fim do semestre. Assim vou compartilhar aqui minha fórmula para escrever textos.


Não fui eu quem criou esse método. Eu o aprendi durante o curso pré-vestibular para fazer redações. Mas ele serve muito bem para trabalhos científicos e técnicos. Seu objetivo é construir o texto em um formato bem definido. Assim o escritor só se preocupa com conteúdo.


Para redações o texto possuirá 5 parágrafos, assim distribuídos:

  1. O primeiro parágrafo introduz o assunto, citando 3 grandes temas a serem abordados;
  2. Cada um dos 3 parágrafos subsequentes descreve um dos temas mencionados na introdução;
  3. O quinto, e ultimo parágrafo, apresenta a conclusão geral do texto.
Além disso cada um dos 5 parágrafos possui o seguinte formato:

  1. É composto por 3 ou quatro frases;
  2. A primeira introduz a idéia do parágrafo;
  3. A segunda desenvolve a idéia;
  4. A terceira frase conclui, já preparando o assunto do próximo parágrafo;
  5. O próximo parágrafo utiliza conectores (Embora, Sendo assim, Porém, Apesar disso) para manter a fluidez no texto.
E assim termina a descrição do formato.


Dessa maneira, ao seguir essa fórmula, aliado à escrita formal em terceira pessoa, você irá escrever uma redação dissertativa que caberá entre 20 e 30 linhas. O texto será conciso e objetivo. Assim o formato exigido em vestibulares será cumprido e o papel do escritor é apenas preencher esse "template" com conteúdo.


Outra vantagem da regra é evitar o uso de frases longas. Elas costumam ser difíceis de entender para o leitor. Grandes sentenças também obrigam o uso de muitas vírgulas. E as regras de uso desse sinal se mostram outra grande dificuldade para alunos.


Mas o TCC de um curso de graduação é maior do que uma redação. Seu formato geral costuma ser descrito em normas ABNT. Apesar disso, ainda é possível utilizar a fórmula supracitada para escrever o texto.


Se a regra dos parágrafos for seguida, você irá obter um texto fluído. Poucas vírgulas serão usadas. Sentenças pequenas deixarão o texto claro. Haverá preocupação com uso de conectores e ligação entre assuntos de diferentes parágrafos, capítulos e subseções.


E a fórmula não se limita a esse tipo de trabalho. Esse post foi escrito utilizando o método. Cada parágrafo foi escrito para elucidar o formato:

  1. Toda introdução de parágrafo está sublinhada;
  2. Todo desenvolvimento em negrito;
  3. Toda conclusão vem depois do desenvolvimento e texto normal.


Para mim esse formato fica bem claro e objetivo. Utilizei também em todo meu livro App Engine e Python. E para você, será que ficou? Gostou do "hack" para escrever textos?

quinta-feira, 24 de dezembro de 2015

Falha no Sistema

Há certo tempo penso que algo está errado no sistema político econômico atual. São vários os indicadores que apontam isso. Comecemos pelo que está de errado na democracia atual.

Nesse sistema busca-se o ideal de se atender o interesse da maioria da população. Como antigamente inviável obter a opinião do povo, esse vota em políticos. O processo é então feito via representação. Mas sabemos que isso não é o que ocorre. Uma vez eleitos os picaretas atendem há apenas 2 interesses: os seus e o daqueles que financiam suas campanhas. É o Game of Thrones da vida real.

O papo para boi dormir é que qualquer cidadão pode se candidatar. Qualquer um pode propor lei. Isso é falacioso. A candidatura pode até ocorrer, já a eleição, não. Ela depende de campanhas publicitárias e recursos para que o candidato apresente suas propostas. Assim, quanto mais recurso em campanha, maiores as chances de eleição. Dessa forma se cria uma ilusão de liberdade e participação política.

Mas quem financia essas campanhas não o faz por acreditar no candidato. O faz por conta de seus próprios interesses. Uma vez com seus financiados na política eles influenciam toda tomada de decisão. São eles sim os verdadeiros donos da democracia. Não possuem mandato com data de expiração e não prestam contas a ninguém.

A primeira forma que pensei para tentar resolver o caso seria participação direta. Com avanço da internet poderíamos implodir os 3 poderes. O povo tomaria suas decisões diretamente. Mas não enxergando isso acontecer rapidamente, outra forma seria começar a implodir o sistema por dentro.

Contudo sempre que vc acha que teve uma idéia original descobre que alguém já pensou nisso. Depois de pouca pesquisa encontrei o conceito já sendo implantado. Veja o Demoex.

Porém isso ainda não acabaria com o maior sistema de controle: o dinheiro. É incrível como eu não entendia que esse é maior ato de fé que exercemos no dia-a-dia, sem contestar. Desde da infância pensamos que o capital possui valor intrínseco. E a única razão dele possuir esse poder é pq todos acreditam nisso.

Sendo o capital a única forma de se obter os recursos que necessitamos quem o controla domina a todos. Não é atoa que todo Estado possui seu monopólio, que é mais efetivo que o controle da violência. Podendo a qualquer momento sequestrar recursos monetários o governo impões suas vontades sem ser questionado. Somos assaltados todos dias através da cobrança de impostos. Para evitar isso seria necessário não depender desse dinheiro. Uma vez que não se faz nada sem dinheiro, a venda da força de trabalho não é opcional.

E de novo alguém já propões solução. Com a criação de moedas virtuais sem controle central, como o Bitcoin, podemos nos livrar dessa opressão. Dessa maneira um sistema que seria possível de se ter seria o Anarcocapitalismo.

A principío gostei da idéia do sistema. Mas logo veio a pergunta: como evitaríamos a formação de cartéis e monopólios? Como garantir que um médigo não vai querer me tirar um orgão para lucrar com isso?Como garantir uma distribuição mais equânime dos recursos quando ser honesto e ético atenta contra o lucro?

Comunismo não é uma solução. Basta olhar os exemplos passados e ver que esse sistema e tão corrupto e egoista como o atual.

Sem perspectiva de solução vivo há 2,5 anos o que se chama de Lifestyle Business. A ideia geral é prezar pela qualidade de vida e tempo livre. Aqui o dinheiro é meio, não fim.

Apesar de extremamente feliz durante esse tempo percebo que viver assim não é possível para todos. O que me garante esse tipo de vida a às outras pessoas que conheço e vivem assim é acesso à educação. Com essa bagagem que é possível aumentar o valor que se recebe por hora proporcionando a felicidade. Acaba que o capital acaba ainda exercendo papel muito importante.

Pensei em criar uma organização onde internamente não seja necessário dinheiro. De fato toda empresa funciona assim. Para a operação ser realizada não existe troca financeira. E se o mundo todo funcionasse assim?

Foi então que zapeando pelo Netflix vi um vídeo sensacional: Zeitgeist Addedum. Nele encontrei um resumo de tudo que já penso sobre dinheiro, democracia e capitalismo. Mas para minha grata surpresa ele apresenta uma proposta de solução: Economia de Recursos.

De fato enxergo vários desses princípios em organizações que participo ou conheço: Hacker Clubes, Open Source, comunidade de Python. Ou seja, mesmo que de forma limitada, isso já existe. Então o que deixa meu cérebro a mil é: será possível fazermos essa mudança? Já imaginou um mundo sem etiqueta de preço? Já imaginou um mundo sem políticos, burocratas, armas, polícia, juízes, advogados, despachantes, vendedores? Já imaginou um mundo conectado, onde a felicidade e qualidade de vida de todos, não o PIB, é a métrica a ser maximizada? Um mundo onde saúde, educação e segurança são a regra, não exceção? O que vc acha?

segunda-feira, 17 de agosto de 2015

Strings em Python

Eu só entendi essa questão de string depois de ver o assunto no curso PyPrático com o Luciano Ramalho. Segue o resumo do que entendi e fiquem à vontade para me corrigir ;)


Unicode é uma tabela ideal que liga números a caracteres. Pense nela como um grande dicionário onde a chave é o número e o caracter seu valor. Ela não tem nada a ver com bytes e esse é o ponto primordial para entender strings. Os números são os conceitos ideais, sem respectiva codificação em bytes.


Encodings são forma de se codificar texto em termos de bytes. Exemplos de codificações famosas: ascii e utf-8.


No Python 2 existe uma certa confusão de strings. O padrão é ascii para qualquer string literal criada. E aqui mora o problema quando se quer usar caracteres especiais. Ex:


print 'ã'


Ao tentar executar vc vai levar um erro:


SyntaxError: Non-ASCII character '\xc3' in file /Users/renzo/PycharmProjects/sandbox-python2/uni.py on line 1, but no encoding declared;


Vc está levando erro porque sua string está encodada em ascii. Portanto ele não consegue entender os bytes presentes em 'ã' e por isso dá o erro. Ascii utilizar apenas um byte e, portanto, só possui 256 (2**8) caracteres.


Ao pesquisar a solução, vc encontrará alguém dizendo para colocar na primeira linha o seguinte código:


# -*- coding: utf-8 -*
print 'ã'


Isso faz alusão ao enconding de seu arquivo py. Agora sua string literal está encodada em utf-8 e pode ser executada com ã numa boa. Mas isso com uma ressalva: se seu console utilizar encode utf-8. Isso é uma verdade para sistemas Unix. Contudo, quem usa Windows vai dizer que o problema continua ocorrendo.


Ao executar o programa no sistema do Bill Gates, se estiver em português brasileiro, vc vai visualizar o resultado 'ã'. Isso ocorre porque o encode do console não é utf-8. Para confirmar a afirmação, experimente rodar o seguinte programa para conferir o encoding:


# -*- coding: utf-8 -*


import sys
print sys.stdout.encoding


Ao executar no Unix recebi o resultado "UTF-8". Já no Windows recebi "cp1252". Ou seja, para imprimir corretamente no nesse último sistema, devemos usar o enconding de seu console. Assim, produzi o código abaixo:


# -*- coding: utf-8 -*
s='ã'
s=s.decode('utf8'# passando para 
unicodes=s.encode('cp1252') 
print s


Com ele recebi o resultado esperado no console. Apesar disso, ainda existe um problema bem grande a ser considerado. Considere o seguinte código:


s='ã'
cp=s.decode('utf8')
cp=cp.encode('cp1252')
print s+cp


O resultado no terminal unix é "ã�". Isso ocorre porque tentei concatenar bytes encodados em utf8 (variável s) com caracteres encondados em cp1252 (variável cp). Como o terminal está em utf8, ele não consegue imprimir os bytes em cp1252 do segundo caracter e coloca o sinal � em seu lugar.


Outro problema interessante é vericar o seguinte:


>>> print(len('ã'))
2
>>> print(len('ã'.decode('utf8')))
1


Será que o Python está maluco? Não, ele não está. No primeiro caso ele está considerando o número de bytes no caracter 'ã' encodado em utf8. E para ele, são necessário dois bytes. Já no segundo caso a contagem de caracter é do unicode e 'ã' é apenas um caracter nessa tabela.


Visto isso, qual a fórmula para tratar strings com sanidade? Eis meu algoritmo:


1)  Verificar com a fonte dos dados o respectivo encoding;
2) fazer o decoding para unicode;
3) fazer operações da regra de negócio (parsing, concatenação etc);
4) Ao enviar dados, encodar string e informar encoding na documentação.


Assim, se as variáveis s e cp fossem strings recebidas de um sistema externo, esse seria o tratamento:


# -*- coding: utf-8 -*


s='ã'
cp=s.decode('utf8')
cp=cp.encode('cp1252')


# colocar tudo em unicode
s=s.decode('utf8')
cp=cp.decode('cp1252')


# Fazer regra de negócio


concatenado = s+cp


# Encodar antes de enviar para console ou sistema externo


print concatenado.encode('utf8')


Se vc quiser criar uma string em código que seja unicode em Python 2, existem duas formas. A primeira é utilizar o prefixo u antes de strings. Assim o código anterior alterado ficaria:


# -*- coding: utf-8 -*


s=u'ã'  # utilizando prefixo u
cp=s.encode('cp1252')


# colocar tudo em unicode
cp=cp.decode('cp1252')


# Fazer regra de negócio


concatenado = s+cp


# Encodar antes de enviar para console ou sistema externo


print concatenado.encode('utf8')


No Python 3 essa questão foi resolvida. Toda string literal no código é unicode. Mais que isso, a classe string é unicode. Strings encodadas são do tipo bytes. Isso condiz mais com a realidade que apresentei no início desse texto. Dessa forma, em Python 3 o código anterior funcionária sem a adição do prefixo u.


É possível ter esse comportamento também no Pyhton 2. Para isso, basta acrescentar  a linha from __future__ import unicode_literals logo após o encoding. Essa é a segunda maneira de se criar string unicode. É a minha preferida:


# -*- coding: utf-8 -*
from __future__ import unicode_literals


s='ã'
cp=s.encode('cp1252')


# colocar tudo em unicode
cp=cp.decode('cp1252')


# Fazer regra de negócio


concatenado = s+cp


# Encodar antes de enviar para console ou sistema externo


print concatenado.encode('utf8')


Assim vc sempre irá criar strings unicode em seu código. Como trabalho sempre dessa forma, configurei minha IDE, o Pycharm, para sempre acrescentar as linhas de enconding e unicode_literals quando utilizo Python 2. O código funciona nas duas versões da linguagem.

Com esse artigo pretendi explicar um pouco de strings, já que perguntas sobre o assunto são recorrentes na principal lista de discussão brasileira . Será que consegui te ajudar? Deixe seu comentário abaixo =D