Skip to content

Silveira Neto Posts

Matemática para a web

Figura - Quadro azul

Eu estive pesquisando algumas ferramentas de matemática para a web a pedido do professor Romildo, professor do departamento de matemática, que está desenvolvendo um sistema web.

É mais ou menos assim:

  • Um conjunto de professores vai criar testes e questões para outros professores espalhados por todo o estado.
  • Para criar e ler as questões os professores vão usar o próprio sistema.
  • Tem que ser fácil de usar, compatível e leve.
  • As questões são de matemática do ensino fundamental e médio.
  • Tecnologias livres.

Algumas ferramentas que eu experimentei, há links para as páginas de exemplo de todos os editores:

exemplo do mathdonalds
Exemplo de editor de fórmulas mathdonalds.

mathdonalds.com: você edita as fórmulas com um editor javascript, ou seja, que roda no próprio browser e depois as fórmulas são exportadas para arquivos de imagem PNG. O editor de fórmulas funcionou bem apesar de não ser muito intuitivo. Eu não consegui fazer algumas fórmulas um pouco mais complexas como raiz quadrada. No site há exemplos de como integrar com outros editores ricos como o TinyMCE ou o FCKeditor. Porém, o editor de fórmulas só funciona no navegador Mozila Firefox e só funciona no Internet Explorer usando um plugin. Não ficou claro pra mim se ele é um software livre ou qual é sua licença. Uma vantagem é que as fórmulas depois de prontas ficam em formato PNG e portanto podem ser vistas em qualquer navegador.

Exemplo do editor do xinha
Exemplo do editor de fórmulas do Xinha.

Xinha: o xinha é um editor rico para web, como o TinyMCE ou o FCKeditor. E também é livre. A diferença é que ele já vem com um grande número de plugins, um deles é um editor de fórmulas. Ao contrario do mathdonalds, você não edita as fórmulas direto na fórmula. Você edita as fórmulas num input em texto plano numa certa sintaxe e vê um preview da fórmula na sua direita. É fácil de usar porque há uma grande tabela com as fórmulas para você clicar e usar. No final ele gera um código em MathML. MathML é uma notação XML para fórmulas. Ela é suportada por praticamente dos softwares de suíte de escritório e em quase todos os navegadores, mas não no Internet Explorer onde é necessário um plugin.

Exemplo do dragmath
Exemplo do DragMath

DragMath: é um editor de fórmulas em Java, no formato de applet. A proposta dele é de criar fórmulas simplesmente arrastando e soltando. Ele é um software livre e certamente é fácil de personalizar. Mas ele não funcionou bem comigo, eu tive dificuldade para criar as fórmulas. Uma vantagem dele é que ele exporta as fórmulas para LATEX, MathML e vários outros formatos.

ascii math

asciimathml.js: Ele transforma de uma notação própria para mathML. Funciona mais ou menos como o editor do xinha, você tem um preview do que está acontencedo. Ele é útil para escrever fórmulas usando uma notação fácil, dentro de um texto e depois abri-lo no browser, mas a página tem que ter um certo javascript integrada.

Das opções que eu olhei a que me agradou mais foi a do mathdonalds.

Papeis de parede para celular

Finalmente consegui recuperar algumas coisas que estavam em um cartão MMC do meu antigo Nokia 6600.

Achei vários papeis de parede que eu usava nele. A maioria é de tamanho 174×132. Quase todos são de paisagens litorâneas. 😀

praiapraiapraiapraialinux xIlhapraiapraiapraialitoralilhaareiaáguapexinhosnevepraiapedrasentardecerpôr do solcéu roxoÁrvore

Também achei esse papel de parede que eu tinha feito de uma foto minha e da Deborah:

Eu e a Deborah se beijando

Sei que foi feito no Gimp e era um papel de parede para computador mesmo. Já os arquivos originais sabe-se lá por onde andam.

Uma carreta sobe uma estrada …

Questão: Uma carreta sobe uma estrada cuja inclinação em relação à horizontal é de 30°, a uma velocidade de 40km/h. A força resistiva é igual a 0,75 do peso da carreta. Que velocidade teria a mesma carreta se descesse a estrada com a mesma potência?

Resposta:

Generalizando, vou chamar o ângulo de Θ e o coeficiente da orça resistiva de ψ.

Subida
Figura 1 – A subida

Essa força resistiva não é exatamente o atrito, porque se fosse o atrito teríamos de calcular as componentes do peso para descobrir a normal. O trabalho exercido por essa força resistiva é igual a força ψ·m·g vezes a distância d.

Na subida:
Ea=Eb
onde

  • Ea = m·v²/2 + Em
  • Eb = m·v²/2 + m·g·h + ψ·m·g·d

A carreta ira de um certo ponto A para um certo ponto B com uma mesma velocidade, a inércia pode cuidar disso. Mas a carreta precisa de alguma energia para converter em energia potencial gravitacional e na energia gasta pelo atrito. Essa energia vamos chamar de Em, a energia do motor. A carreta já parte com essa energia guardada para ser transformada em outras formas de energia. Podemos ver isso como o combustível do veículo. Note que nenhuma energia aparece ou se perde.

Igualando as duas equações temos:

  • m·v²/2 + Em = m·v²/2 + m·g·h + ψ·m·g·d

cortando a energia cinética dos dois lados e como h = d·senΘ:

  • Em = m·g·d·senΘ + ψ·m·g·d

colocando d em evidência:

  • Em = d·(m·g·senΘ + ψ·m·g)

A potência do motor na subida é dada pelo trabalho desenvolvido pelo motor dividido pelo tempo levado para subir do ponto A até o ponto B.

  • Pm = Em/t

Como eu não tenho esse tempo eu posso dizer que o tempo é igual à distância dividida pela velocidade.

  • Pm = Em/(d/v)
  • Pm = Em·v/d

Substituindo Em:

  • Pm = d·(m·g·senΘ + ψ·m·g)·v/d
  • Pm = (m·g·senΘ + ψ·m·g)·v
  • Pm = v·m·g·(senΘ + ψ)

Na descida:

Descida
Figura 2 – A descida

Usando o mesmo raciocínio e notação da subida temos:

Ea=Eb
onde

  • Ea = m·v²/2 + ψ·m·g·d
  • Eb = m·v²/2 + m·g·h + Em

igualando as duas equações:

  • m·v²/2 + ψ·m·g·d = m·v²/2 + m·g·h + Em
  • ψ·m·g·d = m·g·h + Em
  • Em = ψ·m·g·d – m·g·h

Como h = d·senΘ:

  • Em = ψ·m·g·d – m·g·d·senΘ
  • Em = d·m·g·(ψ – senΘ)

A potência do motor é dada pelo trabalho sobre o tempo:

  • Pm = Em/t

Novamente não conhecemos o tempo mas sabemos que ele é a distância sobre a velocidade, que vou chamar de v linha para diferenciar da velocidade da carreta na subida:

  • Pm = Em/(d/v’)
  • Pm = Em·v’/d

Substituindo Em:

  • Pm = d·m·g·(ψ – senΘ)·v’/d
  • Pm = v’·m·g·(ψ – senΘ)

Como queremos que a potência na subida seja igual a potência na descida, igualamos as equações das potências:

  • v·m·g·(senΘ + ψ) = v’·m·g·(ψ – senΘ)
  • v·(senΘ + ψ) = v’·(ψ – senΘ)
  • v’·(ψ – senΘ) = v·(senΘ + ψ)
  • v’ = v·(senΘ + ψ) / (ψ – senΘ)

Note que nesse problema, a velocidade na descida só depende da velocidade na subida, o coeficiente da força resistiva e do ângulo Θ.

Calculando para v = 40km/h, ψ = 0,75, Θ = 30º e senΘ = 0,5.

  • v’ = 40km/h·(0,5 + 0,75) / (0,75 – 0,5)
  • v’ = 40km/h·1,25 / 0,25
  • v’ = 200km/h

Criando uma galeria de imagens com Python

Esse é um script que eu uso muito rotineiramente. Eu escrevi ele porque eu tentei várias soluções mas nenhuma era exatamente o que eu precisava e o que eu preciso é geralmente bem simles.

Só quero pegar um monte de fotos de várias resoluções diferentes e gerar uma página em HTML com as miniaturas das imagens com largura de 500 pixeis e com o link para a imagem original. É uma implementação bem simples, sem muita sofisticação. Eu coloco aqui porque ele é fácil de adaptar para outros usos.

#!/usr/bin/env python
import os
import Image

cwd = os.getcwd()
for arquivo in os.listdir(cwd):
   if arquivo.endswith('.JPG'):
      im = Image.open(arquivo)
      im.thumbnail((500,375), Image.ANTIALIAS)
      nome = arquivo.split('.')[0]
      tnome = nome + "_thumb.jpg"
      im.save(tnome, "JPEG")
      print '
' % (arquivo, tnome)

Ele procura os arquivos do diretório que terminam com .JPG, cria uma miniatura de tamanho 500 por 375 e cospe o HTML na saída padrão. Para usar ele, entre no terminal do diretório onde você quer fazer a galeria e execute o script:

python galeria.py > saida.html

Ele cria galerias bem simples como essa ou essa.

Lançamento do Plano Diretor de Tecnologia da Informação da Prefeitura de Fortaleza

Fui hoje para o primeiro dia de apresentação do PDTI da prefeitura de Fortaleza. Estavam lá várias figurinhas carimbadas do Software Livre daqui de Fortaleza. Estavam presentes o Eder Marques, o Lucas Filho, o Hélcio Brasileiro e vários outros colegas.

Para quem não sabe, a prefeitura de Fortaleza tem gradativamente trocado os sistemas proprietários que existiam na máquina administrativa, hospitais e escolas por Software Livre e soluções baseadas em padrões abertos.

Para ilustrar isso, em janeiro de 2005 haviam 54 laboratórios de informática na prefeitura. Hoje, cortando gastos com software proprietário há 158 laboratórios. Dentre várias outras situações completamente precárias que se encontrava toda a TI na prefeitura de Fortaleza.


Cristiano Terrier fala sobre as dificuldades e soluções encontradas.

No geral os tópicos que eu achei interessantes:

  • A economia de licensa de software possibilitou fazer grandes investimentos em equipamento, treinamento e desenvolvimento.
  • Esses gastos ficam em sua maioria no Ceará.
  • O PDTI é um documento livre disponível sob licença Creative Commons.
  • As licitação de software para a prefeitura não vão exigir só a licença de uso do software mas também seu código fonte sob GPL!
  • Há a proposta de se criar um repositório daqueles softwares livres desenvolvidos para a prefeitura.
  • As licitações dos projetos de cultura da prefeitura vão exigir licença Creative Commons do trabalho.

Amanhã acontecerá a segunda parte do evento, a partir das 8 horas no mesmo local, auditório da FIEC na rua Barão de Stuart, 1980, aldeota. Alí em frente ao Capitão Mustarda.


Marcelo Branco dando uma entrevista pra Tv Fortaleza, que cobriu o evento.

O bom mesmo foi a palestra do Marcelo D’Elia Branco falando sobre “sociedade em rede”. Foi uma palestra incrível sobre redes, filosofia, informática, web, direitos autorais, software livre e tudo mais.

Um ponto que eu achei muito interessante foi o seguinte relato do Marcelo: após uma exposição à filosofia do software e cultura livre o pessoal ligado a informática costumam ser os mais resistentes ao apoio dessas causas. É algo muito interessante porque reunindo algumas das minhas experiências isso parece de fato acontecer.

Foi um papo muito bom mesmo.

Uma outra coisa importante é que o Marcelo está organizando (com Sérgio Amadeu também) o Campus Party Brasil, a maior festa da tecnologia do mundo agora no Brasil!



Que tal juntar um pouco de iniciativa e coragem e montarmos uma caravana aqui de Fortaleza para participar do evento?

bônus 1: o restante das fotos que eu tirei está aqui.
bônus 2: O Eder fez esse post falando mais sobre o evento.

Que internet pequena

A internet pode ser um lugar pequeno e solitário. Pelo menos pra quem é um cara esquecido como eu.
Acabo de ver um vídeo, gostar e ir ler os comentários. Só havia um único comentário, de seis meses atrás e era meu, dizendo que tinha gostado do vídeo!

Teste unitário automático em Python

Suponha que um cliente (um cliente muito estranho) te pediu para implementar uma função que calculasse o número de fibonacci.

Então você criou o seguinte código (em Python):

def fibo(n):
   if n < 2:
      return n
   else:
      return fibo(n-1) + fibo(n-2)

Devido ao alto número de chamadas recursivas você nunca criaria esse código. Ele só está aí a título de ilustração. =)

O código está pronto, será que acabou o serviço? Como saber se os requisitos foram atendidos? Os testes unitários podem te ajudar. Basicamente você o comportamento da função para certas entradas e se elas se comportarem bem para essas entradas você admite que ela está correta. Por exemplo, você sabe que fibonacci de 1 é 1 e que o fibonacci de 10 é 55. O que você faria normalmente seria abrir um console Python ou criaria um programa de teste para testar esses valores.

O problema é que depois de um tempo alguém pode alterar a função que você criou. Ou pior, alguém pode alterar um código numa outra parte do programa que o seu código usava para fazer o serviço. Um bom discípulo da engenharia de software iria fazer novos testes unitários toda vez que alguém mexer no código, mas um discípulo ninja mesmo, vai automatizar essa tarefa.

Se você estiver trabalhando com Python há pelo menos duas formas fáceis de você automatizar essa tarefa usando os módulos doctest ou unittest. Esse módulos já vem com o Python por padrão.

Doctest

Com o doctest você só cria testes unitários simplesmente adicionando algumas linhas de comentários ao seu código e depois fazendo uma chamada ao doctest:

def fibo(n):
   """
   >>> fibo(0)
   0
   >>> fibo(1)
   1
   >>> fibo(10)
   55
   """
   if n < 2:
      return n
   else:
      return fibo(n-1) + fibo(n-2)

import doctest
doctest.testmod()

As últimas duas linhas do programa importam o módulo doctest e pedem para testar aquele programa. Se você salvar o programa como fibo.py e executa-lo, nada aparecerá. Isso é bom, quer dizer que você fez tudo certinho. Vamos supor que eu alterei a função fibo de forma que fibo(10)=20, ou seja, um erro. Então você obtem esse comportamento:

$ python fibo.py
****************************
File "fibo.py", line 7, in __main__.fibo
Failed example:
fibo(10)
Expected:
55
Got:
20
****************************
1 items had failures:
1 of 3 in __main__.fibo
***Test Failed*** 1 failures.

Excelente não é? Se você quiser um relatório mais detalhado use a opção verbose do doctest usando a linha de comando python fibo.py -v.

Unittest

Como o nome já diz, o módulo unittest foi feito para fazer testes unitários. Com ele você pode fazer coisas mais avançadas além de testar coisas como função(parâmetro) = resultado_esperado. na verdade o módulo unittest é um framework para testes unitários.

No exemplo, vamos importar a função fibo do arquivo fibo.py e depois criar uma clase do tipo TestCase.

import unittest
from fibo import fibo

class testa_fibonacci(unittest.TestCase):
   def teste_um(self):
      self.assertEqual(fibo(0),0)

   def teste_dois(self):
      self.assertEqual(fibo(1),1)

   def teste_tres(self):
      self.assertEqual(fibo(7),13)

   def teste_quatro(self):
      self.assertEqual(fibo(10),55)

unittest.main()

A execução dele seria assim:

$ python teste.py
....
----------------------------------------------------------------------
Ran 4 tests in 0.001s

OK

Isso foi só uma brevíssima introdução sobre essas ferramentas. Elas conseguem fazer coisas que você nem imagina. Se você se interessa no assunto eu recomendo fortemente a leitura da documentação do módulo unittest.

Para saber mais: Quality Control in Python, Documentação oficial do unittest e Documentação oficial do módulo doctest.