Archive for the 'codes' Category

Contabilizar espaço usado em FTP usando Python

Aqui na empresa temos duas contas de FTP contratadas no nosso plano de hospedagem para usarmos como espaço de backup. As duas contas tem um espaço limitado e toda semana eu preciso monitorar quanto espaço estamos usando, para evitar erros no script de backup. Para facilitar esse controle eu criei um pequeno script Python para navegar em todas as pastas e me dizer quanto espaço estou usando. O script ficou assim:

  1. import os
  2. from ftplib import FTP
  3.  
  4. def pretty_filesize(bytes):
  5.  if bytes >= 1073741824:
  6.   return str(bytes / 1024 / 1024 / 1024) + ' GB'
  7.  elif bytes >= 1048576:
  8.   return str(bytes / 1024 / 1024) + ' MB'
  9.  elif bytes >= 1024:
  10.   return str(bytes / 1024) + ' KB'
  11.  elif bytes < 1024:
  12.   return str(bytes) + ' bytes'
  13.  
  14. endereco_ftp = 'servidor'
  15. usuario = 'usuario'
  16. senha = 'senha'
  17. conexao_ftp = FTP(endereco_ftp)
  18.  
  19. conexao_ftp.login(usuario,senha)
  20. diretorio_corrente = conexao_ftp.pwd()
  21. soma = 0
  22. for i in conexao_ftp.nlst():
  23.  conexao_ftp.cwd(i)
  24.  for j in conexao_ftp.nlst():
  25.   soma = soma + conexao_ftp.size(j)
  26.  conexao_ftp.cwd('..')
  27.  
  28. print pretty_filesize(soma)

Agora é só colocar no crontab e receber diariamente o espaço utilizado.
Fontes:
http://www.vivaolinux.com.br/script/navegador-ftp
http://code.rivers.pro/python-function-to-convert-bytes-to-kbmbgb/

Enviando DMs do Twitter via shell script

Monitorar os servidores e serviços é uma tarefa importante para manter seus sites e sistemas sempre em ordem. Existem diversas ferramentas bem completas como o Nagios que fazem praticamente todo o serviço. Eu uso o Nagios para monitorar quase tudo e ele me avisa via e-mail de quaisquer problemas. O problema é que nã verifico e-mail o tempo todo.  Uma solução seria mandar os avisos via SMS, mas isso envolve alguns custos.

Nesse momento me lembrei do Twitter. Eu sou um daqueles viciados, que verifica o twitter diversas vezes por dia.  Pensando nisso fiz um pequeno script para monitorar o MySQL e caso o ping não responda eu recebo uma DM avisando.

Um exemplo do script:

status=`mysqladmin ping -hhost -uuser -psenha 2> /dev/null`
  1. if [ "$status"  != "mysqld is alive" ]; then
  2.    curl -u usuario_mon:senha -d "text=Erro conectando ao MySQL&user=eminetto" http://twitter.com/direct_messages/new.xml 2> /dev/null > /dev/null
  3. fi
Um detalhe importante a lembrar é que não é bom usar sua conta no Twitter para enviar as DMs. O Twitter tem uma polí­tica que remove contas que usam muitas DMs por dia, temendo abuso e SPAM. O melhor é criar uma nova conta.  Além disso, é preciso que as duas contas sejam seguidoras uma da outra, senão a DM não pode ser enviada
Claro que eu poderia criar um plugin ou script para o próprio Nagios e deixar ele fazer isso para mim, mas assim ficou mais rápido. Além disso é só um exemplo
Fonte: http://davidwalsh.name/twitter-dm

Material da palestra no PHPSC Conf 2009

Finalmente me organizei e fiz o upload dos slides da palestra que ministrei no PHPSC Conf 2009.
Coloquei no Slideshare. Se alguém precisar do arquivo em outro formato é só me avisar.
Melhorando a performance de aplicações com o uso do MemCache

Procura-se beta testers

Depois de alguns meses de desenvolvimento finalmente posso começar a comentar sobre o projeto que estou trabalhando. Chama-se Drimio.

Agora que estamos chegando perto do grande lançamento estamos recrutando beta testers para nos ajudar a aprimorar o serviço.  Então fica aqui o convite: SEJA UM DOS NOSSOS BETA TESTERS

Lock em arquivos usando SVN e Subclipse

Outra novidade para mim ao usar o Subversion foi o controle de Locks. 

Eu sempre usei o CVS integrado ao Eclipse para gerenciar os projetos que eu trabalhava e com essa duplinha é bem fácil configurar para evitar que dois programadores alterem o mesmo arquivo.

Com o Subversion e o Eclipse (usando o plugin Subclipse) eu não encontrei essa opção. A solução que encontrei foi configurar o cliente do subversion para quando criar novos arquivos marcá-los com um flag. Este flag indica que, para editar o arquivo é preciso que seja feito o “lock” antes. No momento de criar o lock o Subclipse também verifica a versão do arquivo e avisa caso a versão local seja inferior a que consta no repositório. Desta forma eu garanto que o programador sempre tenha a última versão do arquivo e evito que duas pessoas alterem o mesmo arquivo ao mesmo tempo. Existem formas de corrigir isso usando práticas de merge, mas eu acho mais fácil evitar o problema do que resolvê-lo :-)

O que eu fiz foi alterar o arquivo config no diretório do usuário:

mate ~/.subversion/config

Eu estou usando o Textmate no MacOSX. Mas o mesmo passo vai funcionar no Linux. No Windows XP o arquivo encontra-se no diretório

c:\Documents and Settings\usuario\Dados de Aplicativos\Subversion\config

Neste arquivo eu alterei 

# enable-auto-props = yes

para

enable-auto-props = yes

E adicionei alinha abaixo na seção  [auto-props]

* = svn:needs-lock

Desta forma, assim que o programador criar um novo arquivo e realizar o primeiro commit é adicionada esta flag ao arquivo. Todos que forem alterá-lo vão passar pela fase “lock-edit-commit”, com um “update” caso seja necessário.

Dicas de performance para scripts PHP

Excelente artigo com dicas de performance para scripts em PHP.

Vale a leitura

pyBovespa

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

Plugin para o WordPress fazer Highlight em fontes

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

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

Muito útil

Criando uma pseudo-coluna no CakePHP

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 =&gt; $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. 

python-mcrypt

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

Aptana

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.

Professor Nerd

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 :-)

Editores de programação para Mac

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

Material sobre Zend Framework 1.0.1

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.

slimPHP 1.1

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

Arquivos palestra I Boot

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.

Exemplo de RMI

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.

slimPHP

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

Cake PHP e Oracle

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.

Método de Monte Carlo Distribuído

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