quinta-feira, 17 de setembro de 2015

Quando as Restrições Não Restringem

Recentemente eu comecei a desenvolver um sistema em Python. Para os que não são da área de TI, basta saber que é uma linguagem de programação. Para os que são da área de TI: gente, Python obriga o desenvolvedor a identar o código! Dá erro se não identar! Só por causa disso eu já queria adicionar o Guido van Rossum no Facebook, mas ainda por cima o site é bonito, organizado e amigável e a documentação é completa e fácil de consultar.

Na verdade, me ocorre agora que o povo que não é de TI não vai ter o menor interesse neste post. Então, segue a imagem de um coelhinho pra vocês não perderem a viagem.

Uma imagem de um coelhinho pro povo que não é de TI não ficar aborrecido por ter vindo aqui à toa.
(Image courtesy of Katriona Galahad at StockVault.net)

Voltando ao assunto, até agora estou conseguindo usar só o que já vem na instalação padrão do Python, inclusive o IDLE, que é uma IDE bem pobrezinha, mas meio que já me habituei com ele e com suas limitações e estamos nos entendendo bem. Como a minha aplicação é monousuário e os únicos usuários são meu irmão e minha cunhada, optei por um banco de dados embarcado: o sqlite3 também já vem na instalação padrão do Python, o que torna tudo mais simples.

Quer dizer, simples desde que você não precise definir uma chave estrangeira. Sabe chave estrangeira, aquela coisa que todo banco de dados relacional tem para atender à primeira forma normal? Pois é: você pode até defini-las no seu banco, mas não faz a menor diferença e você continua conseguindo excluir o registro na tabela principal, deixando pra trás aquele monte de registros órfãos com uma chave estrangeira que aponta pra lugar nenhum.

Amei o Python um pouquinho menos no dia em que descobri isso. Tudo bem que o problema não é exatamente o Python, e sim o SQLite, mas, quando você inclui algo na instalação padrão, eu encaro isso como um endosso.

Depois de me recuperar do choque de ver minha chave estrangeira ser solenemente ignorada, fui pesquisar o que estava acontecendo e vi que a solução é até bastante simples, porque a constraint da chave estrangeira funciona, sim, e está só desabilitada. E é muito fácil de habilitar, e está explicado bem direitinho na documentação do SQLite. Mas quem desabilita por padrão as constraints de chave estrangeira, meu Deus? Certo, é uma questão de compatibilidade com versões anteriores, mas isso só levanta mais questionamentos: o que diabos estava acontecendo nessas versões mais antigas para que essa compatibilidade se fizesse necessária? E, independente disso: como é que não tem um aviso sobre isso em letras vermelhas garrafais pulando na cara do desenvolvedor no momento em que ele termina a instalação? Não acredito que algum desenvolvedor no mundo começa a usar um banco relacional e pensa "hum, vou conferir na documentação se as constraints de chave estrangeira funcionam mesmo, por via das dúvidas". Se tem alguém que faz isso, me diz onde você está que eu vou aí te dar um abraço, porque você deve ter passado por muitas experiências terríveis para ter ficado assim tão desconfiado de tudo e de todos.

Enfim, fica aqui registrada a solução: ao preparar a conexão com o banco, é só acrescentar uma linha habilitando as chaves estrangeiras.

# Fazer a conexão com o banco
conBD=sqlite3.connect("Dados\cp2.db")

# Criar as tabelas (se ainda não existirem)
conBD.execute("create table if not exists FABRICANTE FA_CD_FABRICANTE integer primary key, FA_NM_FABRICANTE varchar(30) unique not null, FA_TX_SITE varchar(30))")

conBD.execute("create table if not exists REVISTA (RE_CD_REVISTA integer primary key, FA_CD_FABRICANTE integer, RE_NM_REVISTA varchar(30) not null, unique (FA_CD_FABRICANTE, RE_NM_REVISTA), foreign key(FA_CD_FABRICANTE) references FABRICANTE(FA_CD_FABRICANTE))")

# Habilitar as chaves estrangeiras!
conBD.execute("PRAGMA foreign_keys = ON")

De acordo com a documentação, é possível que em versões futuras as chaves estrangeiras passem a vir habilitadas por padrão, mas, pelo menos até a versão 3.6.19, o caminho é esse.

P.S. Guido, não se preocupe: já está tudo perdoado e esquecido, viu? Me liga pra gente marcar aquele chope.

sexta-feira, 11 de setembro de 2015

Howling for you

Ontem eu estive no Museu Nacional de Belas Artes, visitando tanto a exposição permanente quanto as temporárias. Adorei a exposição, vi alguns trabalhos lindíssimos, outros não convencionalmente bonitos mas que me deixaram fascinada e outros que... Pois é.

Como este post está marcado como "diatribe", claro que é desses outros que eu vou falar, né? Mas no fim vou falar também de "Howling for you", o quadro que deu nome a este post porque, de toda a exposição (ou melhor, de todas as exposições que estavam no museu ontem), esse é o que me causou mais impacto. Mas vamos lá: primeiro os outros. 

A obra sem nome

Pra mim, obra de arte tem que ter nome. Não importa se é uma cena de batalha ou um monte de losangos azuis sobre um fundo vermelho, um busto de mármore ou várias caixas de papelão uma dentro da outra. No que o artista estava pensando quando criou aquilo? No objeto que ele estava representando, na situação retratada, em um sentimento? Não tem problema a obra se chamar "Laringite" e ser uma gaiola de ferro com um monte de margaridas de plástico dentro: eu vou botar fé no artista e viajar na dele, encontrando todo tipo de simbolismo ali. Pode também ser um quadro de uma cadeira azul e se chamar "Cadeira Azul". Era nisso que o artista estava pensando ao criar a obra, ué: ele estava com vontade de pintar uma cadeira azul. Tudo bem. Mas, quando nem o artista se dá ao trabalho de dar nome à sua obra e lhe dá nomes como "pintura a óleo", "desenho", ou, como no exemplo abaixo, "composição abstrata", sinto muito, mas eu sou forçada a dar razão àquele povo que diz que o cara fechou os olhos, jogou uns vidros de tinta na direção da tela e onde cair, caiu. Claro, eu posso olhar pro seu quadro abstrato e ver ali um simbolismo para laringite. Mas, vem cá, eu vou ter que fazer todo o trabalho por você? Não, né? Se não tem nome, pra mim não é arte: é decoração. Pronto, falei.

"Composição Abstrata" (Roberto Morvan)
Sério? Isso é uma pintura abstrata? Nossa, eu nem desconfiava...

A obra que não tem nada

E ai, como mesmo entre as pessoas que eu não estou levando a sério sempre tem um que se destaca, vem a artista e dá à sua obra o nome do material do qual ela é feito: mármore preto. Amiga, isso aí já era mármore preto antes de você colocar a mão. Já era mármore preto antes até de você nascer. Pra chamar de mármore preto você não precisava ter tido trabalho nenhum, era só passar em uma jazida, apontar e dizer: "mármore preto".

"Mármore Preto" (Zélia Salgado)

O caso de uso que só tem o fluxo básico

Esse eu vou ter que explicar pra quem não é da área de TI. Quem já trabalha com TI pode pular essa parte: a gente encontra vocês lá na frente daqui a pouco.

O documento de especificação de caso de uso é um documento que descreve, para quem vai desenvolver um sistema, como vai ser a interação do usuário com a aplicação. Por exemplo, o software que controla o caixa eletrônico do seu banco tem um caso de uso "Realizar saque" que é mais ou menos assim:
  1. O cliente seleciona a opção "Saque".
  2. O sistema pergunta qual é a quantia desejada.
  3. O cliente informa a quantia desejada.
  4. O sistema solicita a senha do cliente.
  5. O cliente informa a senha.
  6. O sistema disponibiliza para retirada as notas totalizando a quantia solicitada.
  7. O cliente retira as notas.
  8. O sistema debita o valor solicitado da conta do cliente.
  9. Fim do caso de uso.

Só que este é só o fluxo básico do caso de uso. É o fluxo mais fácil de escrever, porque é o mais óbvio. Mas e se o cliente não tiver saldo suficiente para sacar a quantia que ele pediu? E se ele informar a senha errada? E se o caixa eletrônico não tiver notas suficientes? E se a quantia solicitada exceder o valor limite de saque naquele horário? Essas e outras situações são contempladas pelos fluxos alternativos e pelos fluxos de exceção do caso de uso. E, assim como nos projetos de desenvolvimento e manutenção de software às vezes tem aquela besta-fera dos infernos que acha que só precisa levantar / documentar / desenvolver / testar o fluxo básico, temos artistas como o prezado Manuel de Araújo Porto Alegre que dá ao quadro abaixo o singelo nome de "Uma Grota".

"Uma Grota" (Manuel de Araújo Porto Alegre"

Tá, Manuel, que é uma grota todo mundo já notou. O que o povo quer saber é quem são essas pessoas que não têm a menor cara de espeleologistas e o que elas estão fazendo aqui. Porque as duas moças e a criança estão encolhidas atrás do homem, se abraçando com jeito amedrontado? O que são essas figuras de pedra que o homem está iluminando com a tocha enquanto estende um braço protetor à frente do resto do grupo? São esculturas feitas por algum artista misterioso? São pessoas de verdade que viraram pedra? O que está acontecendo aqui, Manuel, conta pra gente!

Obs. Se estiver difícil de ver esses detalhes todos que eu estou falando, é só clicar na imagem para ver uma versão maior dela.

A obra que deu título a este post

Finalmente, a obra que deu título a este post, não porque ela se enquadre em alguma das categorias acima ou por qualquer outra restrição minha ao seu título. "Howling for you" ("Uivando por você"), da artista Renata de Bonis ganhou menção honrosa neste blog porque sua inclusão na exposição foi, na minha opinião, um toque de gênio. Não dá pra descrever a sensação de, em meio a quadros de Di Cavalcanti e versos de Vinicius de Moraes, perceber de relance, pelo canto do olho, esse quadro bem ali ao seu lado. Sabe aquele "double take" que se diz em inglês, quando você passa os olhos por alguma coisa sem realmente registrar o que está vendo, daí depois de alguns segundo a ficha cai ("Opa, peraí!") e você vira e olha de novo, agora, sim, enxergando? Foi assim comigo. Fiquei um bom tempo parada diante desse quadro, mesmerizada. Assim como em "Uma grota", o título deste quadro não responde a perguntas como quem é essa mulher, de onde ela está vindo e pra onde ela está indo. Mas o título "Howling for you" levanta mil possibilidades e me dá arrepios. Alguma coisa deu muito errado pra alguém e eu tenho quase certeza que não foi pra ela.

"Howling for you" (Renata de Bonis)




sábado, 5 de setembro de 2015

Cadê o Manipulador Que Estava Aqui?

Na semana passada eu fiz a atualização do sistema operacional do meu computador, do Windows 8 para o Windows 10. Para minha grata surpresa, o processo foi simples, razoavelmente rápido e quase sem incidentes. E digo quase porque, embora na hora eu não tenha notado, o Windows fez o favor de desconfigurar o manipulador padrão de links de e-mail do Chrome. Não, Microsoft, eu não vou usar o seu programa de e-mail: já faz mais de 10 anos que eu só uso webmail e pretendo continuar assim. E mudar a configuração dos meus aplicativos na marra não é exatamente a melhor forma de me conquistar. Fica a dica.

Como eu disse, na hora eu não notei; só percebi hoje quando cliquei em um link de e-mail e, ao invés de ir direto pro Gmail, me deparei com uma janela para selecionar o aplicativo padrão para abrir esse tipo de link. Até aí, seria só a Microsoft sendo sem noção; o problema é que as opções oferecidas eram, como eu disse, aplicativos instalados no meu computador e o Gmail... não é um aplicativo instalado no meu computador. Selecionei o Google Chrome, mas não adiantou: os links de e-mail passaram a abrir uma tela em branco.

Bom, mas isso deve ser fácil de resolver, né? Vamos ao Google: é claro que o Google vai me dizer como configurar o navegador do Google para usar o webmail do Google, né? Né, Google? Google?

A sugestão mais comum que eu encontrei foi entrar nas configurações avançadas do Chrome, clicar no botão "Configurações de Conteúdo" (dentro da seção "Privacidade") e depois, na seção "Manipuladores", clicar no botão "Gerenciar Manipuladores". Fiz tudo isso e minha recompensa foi uma tela chamada "Manipuladores de protocolo" contendo uma lista de manipuladores ativos vazia e nenhuma opção de incluir novos manipuladores.

Hora de tentar o plano B.

O que fazer, então? A segunda sugestão foi acessar minha conta no site do Gmail e responder que sim quando me perguntarem se eu quero tornar o Gmail o cliente padrão de e-mail. Tá, mas e se eu acessar minha conta e ninguém me perguntar nada, faço o quê? Grito "Sim!" assim mesmo, bem alto, pra tela do computador?

Hora de tentar o plano C.

Finalmente, em um dos fóruns do Gmail, vi a terceira sugestão, que finalmente funcionou, mas é tão bizarra que estou compartilhando aqui. Em primeiro lugar, fiz logout e entrei de novo na conta do Google. Quando acessei meu e-mail, apareceu não uma mensagem, mas um ícone na barra de endereço, representando... Sei lá o que esse ícone significa.

O Olho de Sauron?

O fato é que, clicando neste ícone, finalmente apareceu a esperada pergunta: "Permitir que o mail.google.com abra todos os links de e-mail?". Sim! Pronto, problema resolvido: e viveram todos felizes para sempre até o Windows 11.

quarta-feira, 2 de setembro de 2015

Preciosos 0,00001%

Há algum tempo atrás — alguns anos, pra ser mais precisa — eu estava almoçando com uma amiga, conversando sobre essas roubadas épicas em que o coração às vezes se mete. Na época, ambas estávamos passando por situações que, embora diferentes em todos os demais aspectos, tinham em comum aquele conflito que ocorre quando o bom senso diz que já está mais do que na hora de seguir em frente mas o coração resiste, insistindo em esperar só mais um pouquinho, porque vai que amanhã ia ser justamente o dia da mudança da maré. Vai que é justamente amanhã que a gente ia se esbarrar na rua. Vai que é justamente amanhã que o outro ia perceber que a gente junto é tão mais certo do que separado. Vai que é justamente amanhã que a gente ia reencontrar o caminho de volta um para o outro. Vai que, né? Quem garante que não? Quem pode ter certeza absoluta, cem por cento que não? Porque o problema é esse: ninguém pode. Ninguém nunca pode ter cem por cento de certeza. E nesse não ter cem por cento de certeza, nesse 0,00001% de chance, o tempo vai passando e a vida não anda.

E, quando a vida não anda, é porque a gente está esperando na fila. Ou melhor, acha que está esperando na fila. Porque fila, por definição, anda; pode ser uma fila longa, pode demorar, mas. se você esperar por tempo suficiente, é certo que a sua vez vai chegar. E é por isso que a gente nunca deve encarar um (não)relacionamento como uma fila. Porque se, por um lado, é possível que essa fila ande, por outro também é possível que ela não ande nunca. E que você, que está ali pensando que está esperando na fila, esteja apenas parada diante de uma porta fechada.

Quando a gente está numa fila, seja ela uma fila literal ou metafórica, a vida da gente meio que para. Não dá pra ficar em duas filas ao mesmo tempo. Não dá pra sair da fila pra almoçar, pra ir ao cinema, pra ir ao banheiro ou beber água. A fila exige comprometimento. Mas comprometimento é — devia ser, pelo menos —, uma via de mão dupla. É por isso que, não importa o quanto você queira e o quanto preze o que te espera no fim da fila, certifique-se de que é realmente uma fila. Muita gente passa anos da sua vida esperando diante de portas trancadas cuja chave há muito foi perdida.

Uma alternativa à fila é a lista de espera. A lista de espera não exige comprometimento: você coloca o seu nome na lista e depois vai tocar sua vida. Você vai ao cinema, sai pra jantar, viaja, vai à praia, vive a sua vida normalmente. Aquelas pessoas bem intencionadas que tentariam te dissuadir nem precisam saber que, guardado no fundo da sua gaveta (plastificado, por via das dúvidas), está um papelzinho com o seu código da lista de espera. Claro que você sabe que ele está lá. Claro que às vezes você abre a gaveta e olha pra ele. Mas você não está parada na fila com sua vida em modo de espera. Pode ser que um dia o seu número seja chamado? Pode. Talvez só haja 0,00001% de chance, mas, e daí? Benditos 0,00001%. Se o seu número for chamado, você atende. Ou não. Isso quem vai decidir é você, se e quando o seu número for chamado. Por ora, por mais que doa saber que aquele papelzinho está ali, escondido mas esperançoso no fundo da gaveta, dói muito menos que a solidão de uma porta fechada.

© Rodjulian | Dreamstime.com - Young Girl At The Green Door Photo