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

terça-feira, 21 de julho de 2015

Vale a pena comprar a casa própria?

A resposta mais sincera que alguém pode dar a essa questão é: são tantas variáveis que não existe resposta certa. Apesar disso a esmagadora maioria dos especialistas em finanças afirmam que do ponto de vista financeiro, não é bom negócio. Por conta disso, escrevo esse post para mostrar como a situação é complexa. Não vou abordar cenários virtuais, como fazem os entendidos, mas analizar um caso real de compra, o da minha casa.


Toda vez que abordo meu caso me dizem que fui sortudo, porque comprei logo antes de uma grande alta. Você pode conferir um gráfico e análise sobre assunto nesse post. Apesar de ser justamente um exemplo que aconselha a não comprar, considero a análise ponderada. Além dos dados, o autor toma o cuidado de dizer que a análise sobre o mercado e previsão de futuro é sua opinião.


Mas voltando em 2006, naquela época visitei inúmeros imóveis. Era a minha primeira casa e eu não tinha como comprar a vista, como a maioria dos brasileiros. Assim, minha análise é para esse caso. Inclusive à época eu tinha, e ainda tenho, amigos no mercado financeiro, que disseram que estava perdendo dinheiro. Ainda bem que não dei ouvidos.


Nesse processo de conhecimento de mercado vc passa a conhecer o preço médio dos imóveis em determinada região. Isso é importante para barganhar preços. Além disso, pode ter alguém apertado, com pressa de vender, então é possível identificar boas oportunidades. Passei 2 meses nesse processo e encontrei uma casa de 250 metros quadrados, 3 quartos mais uma edícula. O preço médio no bairro era de R$ 140.000 em 2006 para esse tipo de construção. Contudo, estava sendo vendida a R$ 100.000.


A razão disso é que o antigo proprietário tinha se mudado para outro bairro e tinha pressa na venda para poder usar o saldo no pagamento da outra casa sem pagar imposto de renda. Essa é uma regra prevista na legislação que pode ser muito interessante. Acabei fechando o negócio em R$ 95.000, dando uma entrada de R$ 20.000.


Aqui cabem duas observações que especialistas em finanças parecem esquecer. Uma é a análise de mercado. Assim como acontece com automóveis, o bom negócio é feito na hora da compra, e não na venda. Conseguir um preço abaixo do mercado, na região de interesse, é o momento mais importante para fazer um bom negócio. Os preços de venda acabam sendo, de certa forma, tabelados. Ninguém nunca paga um valor acima daquele de tabela. Logo os indicadores do mercado imobiliários servem para avaliar tendências de forma macro, mas elas escondem os negócios de oportunidade justamente por se tratar de media de mercado.


O outro ponto é que nos cenários apresentados nas análises sempre colocam a entrada do imóvel na conta. Na legislacão realmente essa entrada é obrigatória. Mas na prática não é. Eu acabei dando a entrada para segurar o bom negócio. Mas o fato é que os corretores me ofereceram, e o fazem a todo mundo, uma forma de burlar esse requisito. Sendo assim, a grande entrada, a que inclusive faz a opção de aluguel gerar grande diferença no início do investimento, não é verdade absoluta.


A lei diz que você devia pagar, na época, 20% de entrada. Contudo, a avaliação da Caixa foi de 150 mil. Nesse caso o contrato poderia ser feito no valor de R$ 120.000, caso fosse do meu interesse. Assim, o dono mentiria, dizendo que recebeu R$ 24.000 (20%) e o valor do financiamento seria de R$ 96. Ou seja, na prática eu ainda colocaria R$ 1000,00 no bolso. Não foi o meu caso e o leitor pode até considerar a prática imoral. Mas que ela existe, pode ter ceteza.

Aliás, sendo os juros da habitação o menor do mercado, essa é uma forma que muita gente utiliza para levantar grana. Que tal se eu fizesse a o finaciemante a R$ 150.000, embolsasse R$ 25.000 e aí sim investisse essa grana? Isso sem tirar nada do meu bolso, num primeiro momento.


Para o primeiro imóvel então o custo de oportunidade é simples de ser calculado, e faço a mesma conta que os analistas. Deve ser tomada a diferença do valor pago no financiamento, retirado o pagamento de um aluguel e aplicada uma porcentagem de rentabilidade a esse valor. Ou seja, no primeiro mês, se decidisse por não comprar o imóvel, eu teria o valor R$ 20.000 para investir menos R$ 700,00, o valor do aluguel. Esse valor de aluguel era o praticado na época e inclusive seguia a lógica de mercado, sendo 0.5% do valor de mercado do imóvel. Eu coloquei os valores na planilha abaixo para você poder brincar. Nela, a coluna "Capital Investido" apresenta a evolução desse valor mês a mês:




A partir desse momento ao montante de investimento foi aplicada a taxa de rendimento. Considerei 20% ao ano. Ou seja, uma taxa digna de nossos vorazes bancos. Além disso, a esse montante é acrescentada a diferença do aluguel para o financiamento, que também é investida.


Ao lado dessa coluna eu acrescentei o lucro da venda do imóvel (Lucro com Venda). Nela eu considero o preço de venda e retiro todo valor já pago no financiamento até o momento. A idéia é poder comparar esse valor com aquele obtido no investimento com aluguel. Você também pode copiar a planilha para simular outros casos. Pode variar o tempo do financiamento, valor inicial do aluguel e o IGPM. Pode colocar outra variação de preço de imóvel.


Além disso, cabe ressaltar dois pontos interessantes. O primeiro é o que levantam os analistas financeiros. O Imóvel possui baixa liquidez, ou seja, é difícil de vender. Sendo assim, deve ser considerado um investimento de longo prazo. Eles tem completa razão nisso.


O segundo ponto é que a parcela do financiamento é decrescente. Comportamento justamente oposto ao do aluguel, que na melhor das hipóteses é aumentado via IGPM, que considerei ser de 3% anual. Sendo assim, ocorre que a partir de agosto de 2012, 5,5 anos após a compra, o valor do financiamento passa a ser menor que o do aluguel reajustado e, portanto, passa então a subtrair valor do investimento, em vez de acrescentar.


Outro dado salta aos olhos: o momento em que o lucro de venda empata com o do investimento. Ou seja, o momento em que o custo de oportunidade passa a ser desfavorável ao aluguel. Isso ocorre em julho de 2009, 2,5 anos depois da compra. O valor passa a ser cada vez mais positivo para depois disso. Mas por que isso ocorre?


O fato é que o mercado não é previsível. Os especialistas financeiros mais honestos mencionam que não se pode saber de quanto será a valorização do imóvel. No meu caso, dei a "sorte" de comprar o imóvel justamente antes de uma valorização elevada no setor. Ao avaliar meu imóvel no início de 2015, me informaram o valor de R$ 500.000,00.


Mas então quer dizer que compensa comprar imóvel? A resposta já dei no início: depende. No meu contexto foi a valorização que acabou fazendo o negócio ser vantajoso. De fato, eu não comprei o imóvel como investimento, foram as outras questões pessoais que pesaram mais. O problema na afirmação dos especialistas é querer dizer que alguém comprar casa é "burro" do ponto de vista financeiro, mesmo que digam isso através de eufemismos.


Aproveitando isso, gostaria de abordar algumas outras questões que nunca vi nas análises que li.

Mobilidade

Nesse quesito costumam apontar, com toda razão, a mobilidade maior que possui quem vive de aluguel. Contudo, para quem não pretende se mudar com frequência, esse fator no aluguel é até uma desvantagem, por conta das mudanças que comento a seguir.


Mudanças


Eu já mudei 10 vezes de casa. Nunca vi colocarem nas contas o custo disso. Ter que pagar carreto sempre é complicado. Mais do que isso, muitos móveis são perdidos no processo: não ficam firmes ao serem remontados; não combinam ou não cabem na nova residência. As vezes também o proprietário pede o imóvel de volta ao fim do contrato, te obrigando, mesmo sem querer, a se mudar.


Aumentos maiores que IGPM


Essa é uma prática muito comum. Ao final do contrato, o proprietário aumentar arbitrariamente o valor do aluguel para refletir o valor do mercado. No caso de minha planilha, o valor atual corrigido via IGPM é de R$ 886,00. Contudo, não se aluga casa na região hoje por menos de R$ 1.600,00. Também fui modesto com o IGMP, que tem girado em torno de 5% e tende a piorar com o aumento da inflação.


Reformas


Acabam quase sempre ocorrendo por conta do inquilino. O máximo que se consegue é descontar os primeiros meses de aluguel, cerca de 3, para isso. Uma vez que o imóvel não é seu, vc não vai poder fazer uma grande reforma para deixá-lo do jeito que você quer. Isso pode ocorrer por proibição do proprietário ou até mesmo porque vc não vai querer perder essa grana que investiu. As vezes as benfeitorias fazem até mesmo o olho do dono "crescer", e pedindo aumento de aluguel no vencimento do contrato.


Segurança


Com a compra da primeira casa vc fica protegido contra variações do mercado imobiliário e inflação. A taxa do financiamento é pré determinada. Então no caso de aumento brusco de alugueis ou preços, você passa a ter uma parcela que é constante e que deixará de existir depois ao financiamento. A grande maioria das análises que vi tratavam da época de inflação a 6%, mas não parece que será esse o caso dos próximos anos.


Obviamente existe a depreciação do imóvel. Mas pelo menos para isso você tem total controle, podendo fazer reformas quando bem entender.


Educação


As análises sempre contam com um grau de educação financeira razoável. A pessoa não só consegue poupar como também tem acesso a investimento com boa rentabilidade. Infelizmente esse não é o caso da grande maioria dos brasileiros.


Tempo Gasto Monitorando Investimentos


Partindo do pressuposto de um investidor educado e que não faça isso para viver, a pessoa irá gastar certo tempo monitorando seus investimentos. Mesmo meus amigos, que são programadores e usam programas escritos por eles para automatizar o processo, acabam tendo que intervir hora outra para calibrar parâmetros. Sendo assim, seria bom colocarem na conta esse tempo gasto, assim como o tempo gasto também na aquisição do imóvel.


Custo Fixo Mensal


O aluguel entra na categoria de custo fixo. Para quem quer, assim como eu, mininizar essa categoria de gasto, comprar a casa é um excelente investimento. Nesse caso cabe também ressaltar a desvantagem dos apartamentos. Comprados ou alugados, haverá condomínio. Então, nesse caso, melhor preferir casa.


Imposto de Renda


Os investimento, com exceção da poupança, possuem cobrança de imposto. No melhor dos casos, ações ou investimentos de longo prazo, seu valor é de 15%. Já para o primeiro imóvel a venda em valor inferior a R$ 440.000 é isenta de IR, desde que outra venda não tenha sido feita nos últimos 5 anos. Também fica fora do alcance do leão se o valor do lucro for utilizado para comprar outro imóvel.


Proteção Jurídica


Esse aqui eu duvido muito que algum especialista aborde. O Imóvel único é considerado na legislação como bem de família, podendo ser penhorado apenas em alguns poucos casos. Ou seja, salvas exceções, caso você tenha algum problema, sua casa estará protegida, já seus investimentos...

FGTS

Com ele é possível dar a entrada e utilizar o saldo de 2 em 2 anos para abater a dívida. Sendo a rentabilidade do Fundo menor que inflação, é uma boa maneira de evitar esse investimento furado que o governo rouba todo mês de quem é assalariado.


Conclusão


Não deixe ninguém dizer que as decisões que você toma com seu dinheiro são erradas. Leia a opinião dos especialistas, mas tente entender o seu contexto, enxergar se ele se aplica a você ou não. Tenho uma amigo que diz que intuição é um poderoso algoritmo, mesmo que não o entendamos. Por isso, siga o que manda seu coração, pois a compra do primeiro imóvel não é um problema determinístico. Duvide de tudo e de todos, inclusive deste post ;)

Existe um ponto em que concordo profundamente com todos especialistas: a decisão não é meramente financeira. Quem já teve que morar de favor na casa dos outros, não tem casa gratuita de papai e mamãe para voltar, sabe que ter a segurança de ter um lugar seu para ir se tudo der errado não tem preço. Essa foi minha motivação e que acabou, por acaso, virando um bom negócio.


Que tal você compartilhar o seu caso, seja ele um exemplo em que a compra foi uma boa ou não? Para você a dica dos especialistas deu certo? Ou você comprou seu imóvel e fez um bom negócio? Compartilhe sua experiência!

Grande abraço!

sexta-feira, 17 de julho de 2015

Bananistão: como criar uma nação de escravos




Quando se fala em escravos logo lembramos de filmes épicos sobre o antigo Egito. Pessoas obrigadas a trabalhar, sem quaisquer direitos. Mas afinal, existiam tarefas a serem cumpridas. E nada melhor do que ter indivíduos obrigados executá-las.

Mas a humanidade evoluiu, sendo o escravagismo abolido na maioria do mundo. Contudo, ainda existem tarefas, então como ter de volta o trabalho escravo para? Como construir uma nação fictícia, que dou o nome de Bananistão aqui, de pessoas obrigadas a trabalhar?

O primeiro passo é fornecer educação de má qualidade. Não apenas para ter massa de manobra, mas principalmente para a população não ter muito conhecimento nem interesse em matemática.

Assim, um assunto simples, como Progressão Geométrica, é decorado mas não compreendido. Baseado nele é feito o esquema de pirâmide. Ou mais próximo do dia-a-dia, os juros. O conceito é tão simples que uma fórmula é facilmente escrita, como na planilha que construí abaixo:





Nela eu considerei uma taxa de 8% ao mês. vc pode alterar o número de parcelas para conferir o valor final de um produto e quanto sairia de juros. E essa taxa está até muito conservadora comparada a aplicada no mercado de cartão de crédito.

Dessa forma, se você conseguir empurrar pessoas para uma dívida dessa elas irão  trabalhar apenas para se sustentarem e manter essa dívida. Contudo, como convencer alguém a entrar nessa loucura?

Então chegamos no segundo passo. Implante na cabeça das pessoas que elas precisam de tudo via publicidade massiva. Mais ainda, torne esses produtos descartáveis: celulares mais avançados, roupas da moda, jóias. Sempre tem algo novo e melhor. Depois criamos sistemas de financiamento a juros 0, sem precisar de aprovação.

Como terceiro passo, convencemos as pessoas que a vida não é caótica. Que imprevistos não acontecem, que empregos são seguros. Acreditando, elas entram no parcelamento, sem perceber que estão vendendo o bem mais precioso que existe: o tempo. Sim, elas estão negociando agora o tempo que precisrão trabalhar para pagar essa dívida no futuro.

Juntando esses ingredientes com a Lei de Murphy, fatalmente boa parte dessa população estará endividada, ou melhor dizendo, escravizada. Mas por que não se rebelam?

Aqui vem o quarto passo. Crie um código de honra sobre pagamento de dívidas. Ensine desde criança que é feio ficar devendo. Cria um slogan, de uma nome bacana, como "nome limpo".

A grande verdade é que o Bananistão quer esconder a verdade, deturpar a realidade. Para que serve um nome? Ele não serve para nada, além de ficar sujo. Ele serve para dar a falsa ilusão de que o cidadão é parte fraca do negócio, quando não é.

Até que uma instituição financeira libere o recurso, ela possui todos os poderes. Após liberar, o devedor é que dita as regras. Sabendo de tudo isso, como se livrar da escravidão?

A primeira e melhor forma é simples: não tenha cartão de crédito, não faça financiamento. Assim vc só compra o que puder, só com o trabalho que já foi feito, e não vendendo tempo de trabalho futuro. Um outro bom efeito colateral é que você passa a ver o real valor das coisas. Agora um celular custa R$ 2.000 e não uma parcelinha de R$ 80.

A segunda maneira, pior, é se vc já entrou nessa. Nesse caso, haja como a parte forte da negociação. Não se limite ao que os ditos "especialistas" financeiros dizem, hackeie o sistema. Experimente não dar atenção as cobranças, a não ligar para seu nome sujo. Junte o dinheiro para pagar a dívida sem acrescentar nenhum juros. Deixe passar 4 anos sem pagar nada e experimente fazer uma proposta de pagamento sem juros, veja o que acontece. Acha que é difícil, então veja esse vídeo onde um devedor atua como parte forte e se divirta:





A verdade é que financiamento é negócio. Não é igual pedir  dinheiro emprestado a parente ou amigo, não tem honra nenhuma envolvida. O que um operador financeiro faz é gerenciar risco, cobrar juros e taxas já colocando na conta aqueles que não pagarão, mitigando essas perdas nas costas de quem vive no cabresto do sistema.

No fim, o princípio das duas soluções é a mesma, e todo mundo conhece desde criança. Só existem duas maneiras de não perder um jogo contra um jogador mais experiente:

  1. Não jogar
  2. Jogar, mas seguindo suas regras, não aos do oponente. Quem nunca roubou dinheiro no jogo banco imobiliário? ;)

Mas e aí, achou o Bananistão parecido com algum país? Será que você conhece algum escravo? Será que você tem solução ainda melhor? Deixe seus comentários ;)

Abs,

quinta-feira, 12 de março de 2015

Como evitar discussões inúteis?

Há 5 anos eu era troll de lista de discussão por e-mail. Percebi então que eu perdia um tempo precioso com isso e que não obtinha nada de positivo. Pelo contrário, acabava fazendo inimizades.

Por conta disso, passei a me policiar. Meu primeiro algorítimo para evitar o problema foi o seguinte: toda vez que eu terminava um e-mail ou mensagem, antes de clickar em “enviar” eu me perguntava: “Alguém, inclusive eu, tem algo a ganhar com o que estou escrevendo?”. Quando a resposta era não, eu simplesmente apagava o e-mail. Eu diria que apenas com isso deixei de ser um troll, passei a enviar 90% menos e-mail e raras vezes entrei em discussão.

Exemplo do algorítimo: certa vez estavam reclamando do Brasil, dizendo que no exterior era muito melhor. Entrei na discussão: Ou você mudava para onde era melhor, ou ficava no Brasil entendendo que as coisas eram diferentes, deixando de reclamar em ambos casos, pois odeio choradeira de quem não toma ação para mudar a situação. Teve gente que concordou e ponderou sobre o assunto. Ou seja, realmente ajudei alguém com a opinião. Mas houve gente que disse que eu estava errado, que era direito reclamar, desabafar e protestar. Comecei a escrever a resposta, ressaltando a inutilidade do “mimimi”. Ao final me fiz as perguntas. Conclui que ninguém ganharia nada. O cidadão que queria desabafar no e-mail apenas ia ficar mais puto consigo e comigo. Quem tinha já concordado e ponderado sobre o que disse não se influenciaria com a opinião em contrário. Resultado: mais um e-mail inútil que não enviei.

Voltando à reflexão, o processo de escrita de e-mail de resposta em si era importante. Era o tempo necessário para eu destilar o “ódio” adquirido durante a leitura da discussão. Porém, isso tomava tempo. Então melhorei o algorítimo. Após ler a discussão e ficar com raiva, eu me perguntava: “Por que estou com raiva disso? No que isso afeta minha vida? A raiva existe apenas por que a opinião é diferente da minha?”. Então quando chegava à conclusão que aquilo na afetaria minha vida ou, principalmente, minha raiva advinha apenas de minha prepotência de achar sempre estar certo e o outro errado, simplesmente a raiva ia embora e sequer um e-mail de resposta eu escrevia. Conclui que se todo mundo pensasse igual, o mundo seria muito chato. Entrei assim no modo Zen, onde deixei de entrar em na maioria de discussões que não levam a nada e passei a realmente a tentar entender pontos de vista diferentes dos meus. A leitura do livro “Como fazer amigos e influenciar pessoas” também me ajudou muito nesse quesito.

Exemplo do novo algorítimo: há certo tempo um cidadão postou uma piada taxada de machista no grupo de Python do Facebook. Houve discussão acalourada, com um lado defendendo o banimento do membro e o outro defendendo liberdade de expressão, julgando a piada domo não sendo machista. Li a discussão. Cada lado já tinha esgotado os argumentos, não havia nada a acrescentar. Ninguém estava preocupado em entender outro lado, apenas querendo provar que sua opinião era a correta. Então se eu emitisse a minha, seria apenas mais um entrando na torcida e, talvez, me indispondo com o pessoal. E tem pessoas que gosto de ambos lados. Então não participei da discussão e preferi focar no que cada um dos envolvidos tem de bom. Em vez de discutir o sexo dos anjos, fui gravar uma vídeo aula para meu canal. Em um minuto esqueci a discussão e fiquei muito mais feliz, pois considerei ser muito mais útil ajudar as pessoas uma aula que ser apenas mais um torcedor. Obs: não estou julgando quem entrou na discussão. Cada um é livre para ser feliz da maneira que julgar mais adequada ;).

Por fim, existia apenas um problema no algorítimo: como definir qual discussão vale à pena entrar? Em qual discussão posso ajudar alguém com minha participação? Encontrei a resposta a reposta no livro “A Arte de Estar Sempre Certo” do Schopenhauer.

Em sua introdução consta, com minha tradução livre: “Em um mundo ideal a discussão e debate deveria almejar a verdade ou ao menos o entendimento mútuo, um acordo. Em tal mundo o desejo de cada pessoa bem intencionada seria identificar os objetivos que valem à pena e os melhores meios de atingi-los, onde as pessoas se esforçariam para resolver os problemas através da cooperação, superando desentendimentos e conflitos.

Mas o mundo é tudo menos ideal, e as pessoas buscam não a verdade, mas ganhar argumentos; elas não buscam o melhor para todos, mas somente o melhor para elas mesmas. Para a grande maioria das pessoas o interesse pessoal é mais forte motivador que altruísmo e, como resultado, elas buscam quaisquer meios para colocar seu nariz à frente na corrida de competição que é a vida”.

No transcorrer do livro, o autor passa então e descrever 38 falácias lógicas que as pessoas usam para ganhar argumentos. Ele alerta que o objetivo não é você usar para influenciar os outros, mas sim para se livrar deles em uma discussão. Mas do que isso, para você poder distinguir os discursos que buscam a verdade daqueles dos quais não vale à pena participar. Leia o livro e assista um debate político. Será extremamente engraçado vê-los utilizando todos os estratagemas, dos mais simples aos mais rebuscados...rs

Dessa maneira, venho aprendendo a identificar discussões infrutíferas e, ao fazer isso, utilizar o ensinamento do Dalai Lama: “É muito difícil argumentar contra o silêncio”.

E você, o que acha do assunto? Será que vou ajudar alguém? Essa é minha intenção. Mas se ele gerar discussão inútil, tenha certeza que não participarei ;)

Grande abraço.

segunda-feira, 2 de fevereiro de 2015

Injeção de Dependência em Java e Python


Aprendi Orientação a Objetos em Java. Inicialmente me foi ensinado a utilizar o construtor para inicializar todas dependências que o objeto necessita para funcionar.
Sendo assim, o código da classe Sorteador é perfeitamente válido:

package di;

public class Sorteador {
    private long limite;

    public Sorteador(long limite) {
        this.limite = limite;
    }
    
    public long sortear(){
        double numero = Math.random()*this.limite;
        return Math.round(numero);
    }

}
Contudo, o problema dessa abordagem consiste na dificuldade de testar o método sortear. Como ele depende de um número aleatório, o máximo que se consegue é verificar se o sorteio se encontra dentro dos limites esperados, conforme código SorteadorTest:

package di;

import static org.junit.Assert.*;

import org.junit.Test;

public class SorteadorTest {

    @Test
    public void testSortear() {
        Sorteador sorteador=new Sorteador(10);
        long sorteio=sorteador.sortear();
        assertTrue(sorteio>=0);
        assertTrue(sorteio<=10);
    }

}
Para contornar o problema, poderíamos componentizar com a finalidade de alterar o comportamento no momento de teste. Com esse objetivo, criei a interface Randomizador:

package di2;

public interface Randomizador {
    double random();

}
Para continuar executando o comportamento original, criei a classe RandomizadorReal:

package di2;

public class RandomizadorReal implements Randomizador {

    @Override
    public double random() {
        return Math.random();
    }

}
Dessa maneira alterei o código do Sorteador . Com essa nova abordagem é possível alterar o componente de randomização utilizando o construtor sobrecarregado. Nessa caso, a dependência do objeto é injetada de fora para dentro. Por isso esse conceito é chamado de “Inversão de Controle” ou também “Injeção de Dependência”:

package di2;

public class Sorteador {
    private long limite;
    private Randomizador randomizador;

    public Sorteador(long limite, Randomizador randomizador) {
        super();
        this.limite = limite;
        this.randomizador = randomizador;
    }

    public Sorteador(long limite) {
        this(limite, new RandomizadorReal());
    }
    
    public long sortear(){
        double numero = randomizador.random()*this.limite;
        return Math.round(numero);
    }

}
Com o código modificado é possível escrever um teste com mais controle. Para isso, basta trocar o componente RandomizadorReal pela classe RandomizadorMock, conforme código a seguir:

package di2;

import static org.junit.Assert.*;
import org.junit.Test;

class RandomizadorMock implements Randomizador{
    public double retorno=0;
    @Override
    public double random() {
        return retorno;
    }
    
}

public class SorteadorTest {

    @Test
    public void testSortear() {
        RandomizadorMock mock=new RandomizadorMock();
        Sorteador sorteador=new Sorteador(10, mock);
        mock.retorno=0;
        long sorteio=sorteador.sortear();
        assertEquals(0, sorteio);
        mock.retorno=0.5;
        sorteio=sorteador.sortear();
        assertEquals(5, sorteio);
        mock.retorno=0.54;
        sorteio=sorteador.sortear();
        assertEquals(5, sorteio);
        mock.retorno=0.56;
        sorteio=sorteador.sortear();
        assertEquals(6, sorteio);
        
    }

}
Esses objetos que se utilizamos para substituir componentes na hora de testes costumam ser chamados de Stub ou Mock. Foi com esses conceitos em mente que migrei para a linguagem Python.

Nela posso escrever classe similar a primeira versão de Sorteador:

from random import random


class Sorteador():
    def __init__(self, limite):
        self.limite = limite

    def sortear(self):
        return round(self.limite * random())
Poderia empregar a mesma técnica para componentizar o método sorteio. Contudo, Python tem uma particularidade interessante: tudo, absolutamente tudo, é um objeto. Inclusive as bibliotecas importadas em um módulo.

Para provar isso, é muito simples. Basta chamar a função dir para inspecionar os elementos do módulo di.py:

>>> import di
>>> [elemento for elemento in dir(di) if not elemento.startswith('__')]
['Sorteador', 'random']
Assim, é possível observar a função random importada como sendo um de seus elementos. Ou seja, bibliotecas importadas em um módulo funcionam como variáveis. Sendo assim, em vez de injetar dependência, a biblioteca alvo pode ser simplesmente alterada na hora do teste:

from unittest import TestCase
import di


class SorteadorTestes(TestCase):
    def teste_sortear(self):
        sorteador = di.Sorteador(10)
        di.random = lambda: 0.5
        sorteio = sorteador.sortear()
        self.assertEqual(5, sorteio)

        di.random = lambda: 0.54
        sorteio = sorteador.sortear()
        self.assertEqual(5, sorteio)

        di.random = lambda: 0.56
        sorteio = sorteador.sortear()
        self.assertEqual(6, sorteio)

De início passei a utilizar essa técnica mas achava que estava fazendo gambiarra. No entanto descobri a biblioteca Mock do Python. Sua função patch serve exatamente para isso, trocar uma biblioteca em tempo de teste por outra. E ela ainda vai além, tomando o cuidado de retornar o componente para seu objeto original após o teste, evitando assim efeitos colaterais indesejados em outros testes.

Enfim, eu gostei muito dessa abordagem distinta do Python. E você o que acha? É gambiarra ou apenas uma forma prática de se fazer Injeção de Dependência?


terça-feira, 30 de dezembro de 2014

Saga do Sequestro em Budapeste - Parte 2



Continuando a saga iniciada nesse post

Após o grito “HHHHHHHHEEEEEEEEEELLLLLLLLLLLPPPPPPPPPPPPP!!!!!!!!!!!!!!!” fecho o olho e aguardo o tiro de pistola. Contudo, ele não vem. Continuo seguindo os jovens e em pouco tempo o segurança e sua parceira desistem de me seguir.
Começo então a pedir ajuda dos jovens, explicando que meu amigo tinha sido sequestrado e corria risco de vida. Fala para ligarem para a polícia. Depois de muita insistência, eles decidem me ajudar.
Um deles bate na porta de um prédio. Aparece então o que seria o síndico, com uma cara de sono danada. Ele então chama a polícia.
Cerca de 10 minutos depois chega a viatura. Os jovens ficam de intérpretes, umas vez que os policiais só falavam húngaro. Mesmo sem entender a língua, no final do papo entendi o contexto. Os oficiais pediram aos jovens para irem na viatura e ajudarem na comunicação. Um deles responde que não, que já tinham se envolvido até demais.
Entro então na viatura com dois policiais que não falam inglês e seguimos em direção ao bar. No caminho, lembro da frase do gangster “Minha cidade, minha polícia”. Penso que se ele tivesse dito a verdade, aí sim eu iria vestir terno de madeira...rs.
Mas na minha cabeça eu tinha que voltar o mais rápido possível. Mesmo torto de bêbado, eu imaginei que começariam a espancar o Beraba, então eu tinha que chegar antes que ele ficasse desfigurado...kkkk.
Parênteses: nesse meio tempo o segurança retornou com a mulher. Disseram para o Reginaldo: “Your friend is crazy, he almost beat me up. He took the money and started to run away”. Traduzindo: “Seu amigo é doido, ele quase me bateu. Pegou o dinheiro e começou a fugir correndo”. O gangster olha pro Beraba e diz: “Now you are in a serious trouble”. “Agora você está com um sério problema”. O sotaque bizarro eu tentei reproduzir nessa gravação:




Enfim, encham o saco do Beraba para ele contar a versão dele pois existem partes engraçadíssimas ;)

Mas continuando a história, eu chego no bar e o gangster está na porta. Ele late alguma coisa com os policiais e depois me diz: “Vocês entraram aqui e não quiseram pagar a conta. Seu amigo está no Hostel. Eu vou colocar um advogado internacional atrás de vcs”.
Eu respondo “Ok, se meu amigo estiver no hostel a salvo, pode mandar seu advogado nos procurar em nosso país”.
Embarco de novo na viatura com o policiais que me levam até o albergue. Chegando lá toco o interfone e começo a falar em inglês, ainda sobre efeito do álcool. Era o Beraba que tinha atendido...rs.
Subo para o albergue e encontro o Reginaldo junto com um uruguaio. Os policiais queriam que pagássemos a conta.
O Beraba liga pro dono do hostel que fala que era melhor a gente pagar.
Então o uruguaio da a ideia de ligarmos para a embaixada. Ligo e me indicam o telefone de uma advogado da embaixada. Ele atende com voz de sono, falando português com um sotaque extramente carregado. Ele conversa ao telefone com os policiais e tenta nos tranquilizar. Eu digo que queríamos uma escolta para levar a gente até a estação de trem para irmos embora. Ele diz que não precisa, que a Hungria não era o Brasil, que estávamos seguros, já que em nenhum momento nos agrediram. Isso, segundo ele, aconteceu porque a lei lá realmente é dura e funciona. Então ele diz que poderíamos ficar na cidade e aproveitar, pagarmos somente se quisermos, e já desligou o telefone meio sugado.
Enfim, vamos para nossas camas. Mas quem disse que conseguíamos dormir. Cada barulhinho no albergue e a gente já ficava alerta, esperando a máfia entrar metralhando tudo...rs
No outro dia nossa história ficou famosa. Todo mundo pedia para contarmos, não só no albergue mas durante todo o resto da viagem. Teve gringo nos encontrando no Vaticano, em Roma, e perguntando o que tinha acontecido. Viramos celebridades...kkkk
No fim, pensamos que se os mal feitores quisessem pegar a gente, pegariam de qualquer jeito, mesmo que decidíssemos partir de manhã. Então decidirmos ficar e aproveitar a cidade.
E foi muito legal. Visitamos os banhos termais, piscinas aquecidas de 22 a 30 graus, a céu aberto, em um inverno de 4 graus. Foi sensacional!
Além disso, visitamos os castelos medievais. Lá tirei essa foto do Beraba:



O engraçado dela, tirada um dia depois do sequestro, é que foi utilizado por toda imprensa nas matérias sobre a invasão do Facebook...kkk.

Enfim, assim terminou a grande saga do sequestro em Budapeste. Acabamos sobrevivendo ilesos e sem pagar a conta!

Apesar de tudo, foi uma das cidades mais legais que visitei durante o mochilão. Recomendo bastante. Mas tome cuidado com os bares da cidade ;).

Abs e feliz 2015.