May
26
2008

Excelente artigo com dicas de performance para scripts em PHP.

Vale a leitura

2
May
1
2008

pyBovespa

Posted In: apple, codes, python, ubuntu by elm

Neste ano eu comecei a investir em ações. É algo ao mesmo tempo emocionante e apavorante porque você pode ganhar e perder dinheiro em questão de horas. Por isso é importante ficar sempre atento as alterações dos valores das ações. Existem vários programas e sites que permitem o acompanhamento das alterações. Mesmo assim, eu aproveitei a manhã de feriado, enquanto me recupero de uma pequena ressaca, e fiz um script em Python que busca os dados da Bovespa e permite o acompanhamento da sua “carteira de ações”. Assim dá para deixar um terminal aberto e ir acompanhando o mercado.
O script foi feito por diversão e uso pessoal, mas se servir para alguém mais legal. O código:

  1. # -*- coding: utf-8 -*-
  2. # Elton Luís Minetto
  3. import urllib
  4. from xml.dom import minidom
  5. from time import sleep
  6. from os import system
  7.  
  8. #adicionar as acoes aqui
  9. #formato ACAO: [num_acoes,valor_compra,data_compra]
  10. acoes = {
  11.  'BBDC4':[100,34.84,'25/04/2008'],
  12.  'PETR4':[100,42.00,'20/04/2008'],
  13. }
  14.  
  15. def atualiza(acoes):
  16.  system('clear')
  17.  url = 'http://www.bovespa.com.br/Mercado/RendaVariavel/InfoPregao/ExecutaAcaoAjax.asp?CodigoPapel='
  18.  for i in acoes:
  19.   url += '|'+i
  20.  f = urllib.urlopen(url)
  21.  xml = f.read()
  22.  xmldoc = minidom.parseString(xml)
  23.  papeis = xmldoc.getElementsByTagName('Papel')
  24.  #cabecalho
  25.  print 'Ação\tValor de Compra\tData da Compra\tQtd\tAtual\tDiferença R$\tDiferença %\tData de Atualização'
  26.  
  27.  total_compra = 0.0
  28.  total_dif_reais = 0.0
  29.  for i in papeis:
  30.   codigo = i.attributes['Codigo'].value
  31.   valor_compra = acoes[codigo][1]
  32.   qtd_acoes = acoes[codigo][0]
  33.   data_compra = acoes[codigo][2]
  34.   valor_atual = i.attributes['Ultimo'].value.replace(',','.')
  35.   data_atual = i.attributes['Data'].value
  36.  
  37.   diferenca_reais = (float(valor_atual) * qtd_acoes) - (valor_compra * qtd_acoes)
  38.   diferenca_perc = (diferenca_reais*100)/(valor_compra * qtd_acoes)
  39.   total_compra += valor_compra * qtd_acoes
  40.   total_dif_reais += diferenca_reais
  41.  
  42.   print '%s\t%02f\t%s\t%d\t%s\t%02f\t%02f\t%s' % (codigo,valor_compra,data_compra,qtd_acoes,valor_atual,diferenca_reais,diferenca_perc,data_atual)
  43.  
  44.  print 'Total de Compra:%02f' % total_compra
  45.  print 'Total da Diferença em Reais:%02f' % total_dif_reais
  46.  total_dif_perc = (total_dif_reais * 100)/total_compra
  47.  print 'Total da Diferença em Percentual:%02f' % total_dif_perc
  48.  sleep(1200)
  49.  
  50. while 1:
  51.  atualiza(acoes)

Eu testei o script no MacOSX Leopard. Mas deve funcionar legal no Linux e no Windows
Download do arquivo

8
April
25
2008

Encontrei esse plugin para o Wordpress que faz highlight em códigos nos posts:

http://wordpress.org/extend/plugins/highlight-source-pro/

Muito útil

0
April
25
2008

Estou desenvolvendo um sistema grande usando o framework CakePHP e surgiu uma necessidade. Precisava criar uma pseudo-coluna com o resultado do cálculo de outras duas. Seguindo o conceito de MVC, achei mais interessante fazer este cálculo no Model para poder usar em todos os programas que utiizam aquela tabela. 

Para ilustrar isto montei um exemplo. Criei a seguinte tabela:

  1. CREATE TABLE IF NOT EXISTS `clientes` (
  2.   `id` int(11) NOT NULL AUTO_INCREMENT,
  3.   `nome` varchar(100) NOT NULL,
  4.   `sobrenome` varchar(100) NOT NULL,
  5.   PRIMARY KEY  (`id`)
  6. ) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=2 ;

O Model da tabela ficou da seguinte forma:

  1. class Cliente extends AppModel {
  2.  
  3.   var $name = 'Cliente';
  4.   var $validate = array(
  5.   'id' => VALID_NOT_EMPTY,
  6.   'nome' => VALID_NOT_EMPTY,
  7.   'sobrenome' => VALID_NOT_EMPTY,
  8.   );
  9.  
  10.   /*
  11.   funcao que é executada toda vez que é realizado uma consulta na tabela  
  12.   esta funcao adiciona o nome completo do cliente ao resultado como uma pseudo-coluna.
  13.   idéia tirada de http://www.paulherron.net/articles/view/cakephp_afterfind_psuedofield
  14.   */
  15.   function afterFind($results) {
  16.      if(isset($results['0']['Cliente'])) {
  17.        foreach ($results as $key => $val) {
  18.          $results[$key]['Cliente']['nome_completo'] = $results[$key]['Cliente']['nome']  . $results[$key]['Cliente']['sobrenome'] ;
  19.        }
  20.     }
  21.    return $results;
  22.   }
  23. }

E na visão eu simplesmente imprimo a pseudo-coluna: 

echo $cliente['Cliente']['nome_completo'];

Simples assim. 

1
April
22
2008

python-mcrypt

Posted In: codes, home, python by elm

Recentemente precisei criptografar alguns dados gerados por uma aplicação em Python. Para isso resolvi testar o python-mcrypt, módulo desenvolvido pelo brasileiro Gustavo Niemeyer.

Demorei um pouco para conseguir entender o funcionamento, mas é bem simples. Fiz um exemplo de uso para alguém não precisar perder o mesmo tempo que eu investi :-)

exemplo_mcrypt

0
April
16
2008

Aptana

Posted In: codes, home by elm

Faz um bom tempo que tenho usado o Eclipse como IDE para trabalhar com PHP, principalmente por causa do suporte a CVS que preciso para alguns projetos.

Ele é muito bom, mas uma coisa estava me irritando. A dificuldade de configurar cores de fundo e cores da sintaxe. Parece besteira, mas o fundo branco padrão do Eclipse agride os olhos depois de algumas horas de uso.  No Komodo Edit é muito fácil trocar essas configurações mas no Eclipse é muito complicado e limitado.

Então resolvi fazer um teste com o Aptana . E me surpreendi. Ele tem tudo o que o Eclipse tem (é baseado nele) como CVS e outros plugins, suporte a várias bibliotecas de Ajax como ExtJs, jQuery, etc. E tem suporte a alterar as cores de uma maneira bem fácil e completa. 

Segui estes passos e estou bem feliz com minha nova configuração.

3
February
28
2008

Professor Nerd

Posted In: codes, home by elm

Nas disciplinas que ministro sempre aplico vários trabalhos para reforçar o conhecimento dos alunos. Todos os trabalhos são divididos em duas partes: 7 pontos a entrega do texto/código e os outros 3 pontos vem da apresentação oral. Quando o trabalho é em grupos eu sempre sorteio um dos componentes para apresentar e a nota da apresentação vale para o grupo todo. Tem dado certo. O único problema era fazer o sorteio dos alunos de forma justa. Para isso fiz um script em PHP que resolve isso pra mim.

Professor Nerd é isso :-)

7
January
26
2008

Nesses meses como novo usário de MacOSX testei alguns editores para trabalhar com programação, principalmente com PHP, Python, HTML e CSS. Encontrei alguns interessantes. Deixo aqui minhas opiniões sobre o assunto.

Eclipse

O primeiro que testei foi o Eclipse, pois é o que utilizo no meu trabalho diário na universidade. Lá eu utilizo em ambiente Linux e no OSX tudo funcionou da mesma maneira. Só algumas telas e teclas de atalho mudam. O Eclipse é uma ferramenta muito poderosa. Instalando os plugins corretos, PDT para PHP e PyDev para Python, é possível ter todas as características que esperamos deste tipo de ambiente. O que eu mais gosto é o suporte nativo a CVS (extremamente útil para projetos maiores pois não consigo mais programar sem este recurso), o auto complete dos comandos PHP e HTML que funciona certinho, aquilo que o Eclipse chama de Outline onde ele mostra os métodos e funções do arquivo aberto, e a árvore de arquivos/diretórios que facilita o acesso rápido aos códigos. O que eu não gosto no Eclipse é a quantia de memória que ele utiliza.

Smultron

Já comentei sobre o Smultron aqui no site. É um editor bom, open source e leve. O que eu sinto falta é o equivalente ao Outline e a árvore de diretórios do Eclipse. Além disso, a interface do programa não é tão bonita quanto o resto do sistema operacional

TextWrangler

O TextWrangler é um editor feito pela mesma empresa que desenvolve outro editor famoso (e pago) para o Mac, o BBEdit. É uma versão com menos recursos do que a versão comercial, mas mesmo assim é muito bom. Leve, suporta várias linguagens de programação, interface polida, acesso a ler/gravar arquivos direto em servidores FTP/SFTP, possui algo equivalente ao Outline do Eclipse, além de ser altamente configurável. Uma boa opção. Só senti falta da árvore de diretórios para rápido acesso aos arquivos.

Komodo Edit

É a versão para Mac do editor do qual já comentei aqui no site. É muito bom. Rápido, possui a árvore de diretórios (que se atualiza automaticamente caso um arquivo seja criado ou excluído. Cool), é extensível usando-se plugins quase da mesma maneira que o Firefox, apesar de ainda existirem poucos disponíveis. E o auto complete é tão bom quanto o do Eclipse, se não for até melhor. Só faltou o Outline e suporte a CVS pra ser um bom substituto ao Eclipse. Mas isso só na versão paga, que por enquanto está fora do meu foco de avaliação

Vi/VIM

Lógico que não dava para esquecer do velho amigo. Outra vantagem do OSX ser derivado do Unix é poder usar o Vi. É um bom editor de programação como é possível ver nesse excelente artigo

Conclusões

Depois de testar estes softwares cheguei as seguintes conclusões:

  • Para projetos grandes, onde o CVS/Subversion é importante, o Eclipse ainda é a melhor opção.
  • Para projetos menores eu estou usando o Komodo Edit e estou satisfeito. Tenho usado ele bastante em projetos com o CakePHP e outros frameworks como o Django (ele tem suporte ao Django além do próprio Python)
  • Para editar arquivos PHP/Python de maneira rápida, sem precisar ver todo o projeto eu estou usando o TextWrangler
  • E para arquivos de configuração, como o httpd.conf e outros, o bom e velho Vim é a solução
  • É possível programar confortavelmente sem precisar comprar um TextMate ou o BBEdit (apesar do TextMate ser muito bonito)

Se alguém usa outro editor ou discorda de alguma das conclusões me avise

5
October
25
2007

Gostaria de indicar um material muito legal sobre o Zend 1.0.1 escrito pelo Flavio Gomes da Silva Lisboa

Como construir uma aplicação MVC em PHP 5 com Zend Framework

Ambiente integrado para Zend Framework

Ambos bem completos e bem escritos. Vale a pena a leitura.

0
October
18
2007

slimPHP 1.1

Posted In: codes, docs, home by elm

Aproveitando o lançamento da nova versão do Ubuntu, aproveito para fazer o lançamento da versão 1.1 do framework slimPHP. Este é um framework que desenvolvi a algum tempo atráz e foi adotado como principal ferramenta de desenvolvimento de novos aplicativos na universidade onde trabalho, a Unochapecó.
Esta nova versão contou com a colaboração dos desenvolvedores da Unochapecó Odair Lopes, Francis Perini, Clemente Scaratti e o professor Jorge Antônio Di Domenico.

As novas features do framework são:

Classe tabela

  • Adicionado método getAllData() que retorna todos os dados da consulta na forma de um array

Exemplo:
$tab = new tabela(”pessoa”);
$tab->get(array(”*”));
$dados = $tab->getAllData();
unset($tab);
app::showView(”view/index_view.php”,$dados);

  • Adicionado método setData() que automaticamente seta os valores para a tabela apartir dos dados vindos do $_POST ou $_GET

Exemplo:
$tab = new tabela(”pessoa”);
$tab->setData($_POST);
$tab->insert();
$tab->save();
unset($tab);

  • Adicionado campo opcional $order no método get() na forma de uma string para poder escolher os campos de ordenação do SQL

Demais inclusões

  • Adicionado o crudGenerator na pasta extra. Manual
  • Foram adicionados os arquivos header.php e footer.php no diretório de visões representando o cabeçalho e o rodapé das visões.
  • Adicionada a classe report.

Exemplo
Controlador
< ?
include("../slimphp/classes/app.php");
include("../slimphp/classes/tabela.php");
/**
* Objetivo: Descrição
* Autor: Nome
* Data: Data
*/

class XXX extends app {
function index() {
$tab = new tabela("pessoa");
$tab->get(array(”*”));
$dados = $tab->getAllData();
unset($tab);
app::showView(”view/index_view.php”,$dados);
}
}
$app = new XXX(”mysql://root:@localhost/slimphp”);
?>
Visão
< ?php
include("../slimphp/classes/report.php");
$r = new report('Titulo do Relatório');
$header = array('Código','Nome','CPF','RG'); //cabeçalho da tabela

$r->Table($header,$dados,’Pessoas’); //gera uma tabela
$r->Text(’Total de Pessoas ‘.count($info)); //gera uma linha de texto
?>

O download desta nova versão pode ser feito neste link

0
September
22
2007

Ontem ministrei a palestra sobre CakePHP na Unoesc em Xanxerê.
O arquivo da apresentação pode ser copiado aqui e o aplicativo criado neste link.

3
August
27
2007

Exemplo de RMI

Posted In: codes, home by elm

Estou novamente ministrando a disciplina de Sistemas Operacionais Distrubuídos. É uma disciplina bem complexa mas muito divertida. Já me rendeu algumas horas de programação e diversão.

Um dos tópicos é a comunicação entre processos em sistemas distribuídos. Aí entra sockets, RPC, RMI, Corba e WebServices. Ano passado tinha desenvolvido um exemplo de um programa distribuído em sockets que depois foi desenvolvido usando Pyro por outro professor. Agora consegui um tempo e desenvolvi o mesmo algoritmo usando Java RMI.

Aqui está o código se interessar para alguém. Vale lembrar que não programo regularmente em Java por isso a solução pode estar bem “tosca”. Se algum Java Jedi quiser melhorar eu ficaria muito feliz.

0
January
2
2007

slimPHP

Posted In: codes, home by elm

Finalmente criei o projeto do slimPHP no Sourceforge.

slimPHP é o nome, pouco criativo, que dei para o pequeno framework que desenvolvi e que estamos utilizando aqui na Unochapecó no desenvolvimento de novos aplicativos.

Eu já havia descrito ele anteriormente aqui no site, mas agora no sourceforge fica mais fácil de alguém visualizar os códigos e fazer o download.

O site ficou horrível, sem nenhum design. Se alguém tiver interesse de ajudar nisso e em qualquer coisa relacionada eu agradeço

Site: http://slimphp.sourceforge.net

0
September
24
2006

Cake PHP e Oracle

Posted In: codes, home by elm

O Cake PHP é um framework de desenvolvimento em PHP 5 baseado nos conceitos de MVC. É uma ferramenta muito interessante para gerar aplicações padronizadas como cadastros, relatórios, etc.

Desenvolvi a parte de conexão com a base de dados Oracle. Aparentemente vai ser adicionada oficialmente na versão 1.2.x do Cake, mas já pode ser copiada e testada neste endereço. Se alguém encontrar algum bug me avise.

8
August
27
2006

Texto que usei na disciplina de Sistemas Operacionais Distribuídos que estou ministrando. É uma implementação em Python de um programa usando sockets para demonstrar a comunicação em um sistema distribuído.

Download 

4
July
25
2006

Minha aplicação Web 2.0

Posted In: codes, home by elm

Estou entrando na Onda 2.0 também. Desenvolvi uma aplicação em PHP+AJAX para controlar as despesas pessoais direto no browser.

Checklist Web 2.0:

- usa fontes Arial (ok)
- desenvolvido com algum framework (ok, desenvolvido com o meu framework, mas já é um framework)
- usa css e tableless (ainda falta um monte para estar ok)
- usa ajax pra caramba (ok)
- tem a palavra beta no nome (não tem nome ainda mas o beta está lá)
- release cedo e release sempre (ok)
- feeds (ainda não)
- compartilhe com os amigos (agora está ok)
- wiki/blog falando sobre o desenvolvimento (ok)
- é gratuíto! Renda vinda do AdSense (ok)
- faz somente uma coisa simples e não um monte de coisas (ok)
- interface simples e fácil (falta muito)

Bugs conhecidos:

- por enquanto só funciona no Firefox. Estou trabalhando nisso

Todo list:

- nome cool
- design
- divulgar
- ser comprado pelo google e ficar rico

A parte do checklist é um pouco de brincadeira. Desenvolvi isso para treinar o AJAX e além disso, está pipocando de aplicações Web 2.0 na internet então porque não fazer uma? No brasil o boom da Web 2.0 está começando a chegar, quem sabe não dá certo?

Endereço:

http://www.eltonminetto.net/financas/ (provisório)

13
July
14
2006

Formulário dinâmico

Posted In: codes, home by elm

Um amigo me mandou um e-mail pedindo se eu conhecia alguma maneira de criar formulários dinamicamente. Por exemplo, um formulário de cadastro onde a pessoa pode ter que cadastrar um número indefinido de filhos ou de produtos.

Eu e o colega Odair fizemos uns testes e conseguimos achar uma solução.

Código

Testamos no Firefox, IE6 e Opera 9.

8
June
2
2006

Miniframework AJAX

Posted In: codes, docs, home by elm

Seguindo a idéia do meu Miniframework PHP criei o Miniframework AJAX. Não tem nada de complexo, a idéia e “escrever menos código sem ter que aprender muita coisa nova”.

ajax.js - arquivo com os comandos JavaScript

ajax_frame.php - Exemplo de uso

teste_frame.php - PHP que é chamado pelo AJAX

espera.gif


Demonstração

6
May
30
2006

Numa aula eu estava explicando a técnica de programação “Divisão e Conquista”, que consiste em dividir um problema grande em pequenos subproblemas e resolvê-los separadamente de forma que o resultado deles seja o resultado do problema original. Um exemplo de algoritmo desenvolvido nessa técnica é o de busca binária, onde o espaço de busca é sempre dividido pela metade, diminuindo o tempo de pesquisa. Para ilustrar a diferença desenvolvi dois scripts em Python para mostrar o tempo de execução de um algoritmo de pesquisa usando “força bruta” e a pesquisa binária. Para isso usei o módulo timeit do Python. Com este módulo é possível medir o tempo de execução de pequenos trechos de código. Abaixo os códigos usados:

Pesquisa por Força Bruta

Pesquisa Binária (Divisão e Conquista)

Comparação dos tempos de execução

Como neste caso são poucos dados a serem pesquisados a diferença de tempo não é tão grande, mas é visível o suficiente para ilustrar aos alunos a diferença.

2
May
17
2006

Um dos conteúdos que estou trabalhando na disciplina de Algoritmos e Estruturas de Dados III é Padrões Algoritmicos.

Dentre estes padrões existem os chamados “Algoritmos de Força Bruta (brute force algorithms)” e os “Algoritmos Gulosos (greedy algorithms)”.

Segundo [1], “um algoritmo de força bruta resolve um problema da maneira mais simples, direta e óbvia. Como resultado esse algoritmo terminar realizando muito mais trabalho para resolver um certo problema do que um algoritmo mais sofisticado. Por outro lado, um algoritmo de força bruta é em geral mais fácil de implementar do que um outro mais sofisticado e, por causa da sua simplicidade, às vezes ele é mais eficiente.”

O mesmo autor sugere um exemplo de problema a ser resolvido usando essa abordagem, o problema da Contagem de Dinheiro. “Considere o problema que um caixa de banco resolve sempre que ele ou ela precisa dar ao cliente uma certa quantidade de dinheiro. O caixa tem à sua disposição um conjunto de várias notas e moedas de valores diferentes e precisa contar uma certa quantia usando o menor número possível de peças.”

Um algoritmo usando a abordagem de força bruta iria testar todas as combinações possíveis até encontrar a melhor combinação. Fiz um código em Python para ilustrar esse algoritmo:

forca_bruta.py
Executando o script:

bash-3.00$ python forca_bruta.py
Digite o valor a encontrar
20
Solucoes encontradas
Solucao [1, 1, 1, 1, 1, 15]
Solucao [10, 10]
A melhor solucao eh
[10, 10]

O algoritmo encontrou duas soluções e sugeriu como a melhor a que usou menos moedas. Nesta abordagem ele testa todas as possibilidades até encontrar a melhor.

Já com a abordadem de algoritmos gulosos uma lógica mais sofisticada é utilizada. O caixa de um banco não iria testar todas as possibilidades até encontrar a melhor. Ele iria pegar as moedas com maior valor primeiro e iria encontrar uma solução para o problema. A idéia dos algoritmos gulosos é encontrar uma resposta não sabendo se é a melhor delas, mas torcendo para que seja. O algoritmo abaixo resolve o mesmo problema usando esta abordagem:

guloso.py
Sua execução retorna o seguinte:

bash-3.00$ python guloso.py
Digite o valor a encontrar
20
Solucao
[15, 1, 1, 1, 1, 1]

Ele mostra a primeira solução que encontrou. É mais rápido do que o força bruta e é uma solução correta, mas não é a melhor solução, que neste caso seria [10,10].

Mais um exemplo de python com ferramenta didática.

[1] http://www.brpreiss.com/books/opus7/

2