programação

Script para retirar emails duplicados

Fiz um script para retirar emails duplicados de uma lista, colocar estes emails em ordem alfabética e retirar os emails que constam em uma lista de exclusão.

Talvez seja problemático o fato do script ter sido feito com a sintaxe do python 3 🙁

O script deve rodar em uma pasta que contenha um arquivo mailing.txt com uma lista de emails e outro arquivo mailing opt-out.txt com lista de emails que devem ser retirados da lista principal. Estes arquivos devem ter um endereço por linha.

O script:

#!/usr/bin/python
import datetime, os, sys
print("Removing double entries in mailing and opt-outs")
 
t = datetime.datetime.now()
timeStamp = str(t.today()).replace(':', '-')
fMailing = 'mailing.txt'
fMailingOut = 'mailing opt-out.txt'
backupFolder = 'mailing-backup' + os.sep
fMailingBackup = backupFolder + fMailing + '.' + timeStamp + '.backup'
fMailingOutBackup = backupFolder + fMailingOut + '.' + timeStamp + '.backup'
 
try:
  fMailingHandle = open(fMailing)
  fMailingList = fMailingHandle.readlines()
except IOError:
  print('Put a file named ' + fMailing + ' in this folder before running me.')
  sys.exit()
 
try:
  fMailingOutHandle = open(fMailingOut)
  fMailingOutList = fMailingOutHandle.readlines()
except IOError:
  print('Put a file named ' + fMailingOut + ' in this folder before running me.')
  sys.exit()
 
lstEmail = []
lstOptOut = []
 
for email in fMailingList:
  lstEmail.append(email.lower())
 
for email in fMailingOutList:
  lstOptOut.append(email.lower())
 
fMailingHandle.close()
fMailingOutHandle.close()
 
#transform in a set to make each email unique
print("Original size: mailing=", len(lstEmail), ", out-out=", len(lstOptOut))
lstEmail = set(lstEmail)
lstOptOut = set(lstOptOut)
 
for email in lstOptOut:
  try:
    lstEmail.remove(email)
  except KeyError:
    #print("email da lista de out-out não existe no mailing: tudo bem!")
    pass
 
print("Actual size: malling=", len(lstEmail), ", out-out=", len(lstOptOut))
print("Saving results in files... I'll keep some backup files (with timestamps).")
 
if os.path.exists(backupFolder):
  print('backup folder exist')
else:
  os.mkdir(backupFolder)
  print('bakckup folder does not exist')
 
print(fMailing, ", " , fMailingBackup)
os.rename(fMailing, fMailingBackup)
os.rename(fMailingOut, fMailingOutBackup)
 
#save the opt-out list ina a file
fMailingOutHandle = open(fMailingOut, 'w')
for email in sorted(lstOptOut):
  fMailingOutHandle.write(email)
fMailingOutHandle.close()
 
#save the mailing in a file
fMailingHandle = open(fMailing, 'w')
for email in sorted(lstEmail):
  fMailingHandle.write(email)
fMailingHandle.close()
 
print("Ready, done :)")

Os plugins que eu utilizo no eclipse

Eu utilizo o eclipse wtp europa que possui todos os plugins que eu preciso. Esta versão do eclipse pode ser baixada por este link:

Versão para o Windows
Todas as versões, inclusive linux e Windows

O eclipse wtp europa é a consolidação de diversos plugins. Com ele dá para programar em java, editar qualquer arquivo xml, arquivos jsp e sql. Existem uma perspectiva que permite a conexão com qualquer banco de dados jdbc, e a partir daí posso rodar queries sql simples. Para tarefas mais exigentes eu utilizo um programinha externo chamado Squirrel SQL. Prefiro utilizar o wtp com o Squirrel ao plugin quantum, que também é um bom plugin.

Dificilmente eu trabalho com o hibernate. Quando isso acontece eu utilizo um segundo plugin para o eclipse que é o hibernate tools, do grupo jboss. Fora isso não instalo nenhum plugin. É comum o eclipse ficar instável após a instalação de muitos plugins. Por isso eu prefiro uma instalação mais enxuta que normalmente se limita ao wtp.

Um outro plugin que muitos colegas usam é o sysdeo. O papel desse plugin é iniciar e derrubar o tomcat e facilitar o debug. Eu não gosto nada nada desse plugin, e prefiro fazer o debug dispensando o uso de quaisquer plugins. Para fazer isso, veja esse link: .

Por fim, existe o plugin para o struts chamado Easy Struts. Esse plugin dá uma visão gráfica do struts-config.xml. Eu deixei de utilizar o plugin assim que eu entendi como funciona o xml, porque eu sempre achei, e continuo achando que o struts-config.xml é uma aberração da natureza. Agora com o struts 2 ficou bem mais fácil de mapear as ações, e eu não sinto necessidade alguma de plugin.

Bem, esses são os plugins que eu utilizo ou que já utilizei no eclipse.

Hotdeploy no tomcat

Voltei a acreditar no hotdeploy do tomcat.

O tomcat tem o recurso de deploy de aplicativos com o tomcat rodando. Isso economiza muito tempo de desenvolvimento, pois o processo de ligar o tomcat pode demorar bastante tempo. Acontece que quando algo de errado acontece vários problemas imprevisíveis se propagam, consumindo tempo de desenvolvimento (a toa). É por este motivo que a maioria dos desenvolvedores java que conheço sempre desligam o tomcat para realizar um novo deploy. Além de chato é ineficiente.

Descobri que este problema é mais comum no Windows. Vou explicar o porquê. Quando um deploy é feito com um arquivo war, o seu conteúdo é descompactado na pasta webapps, e um arquivo de configurações xml é criado na pasta conf do tomcat. O processo de undeploy apaga o xml, o arquivo war e toda a pasta do context. Até aí tudo bem.

É comum, também, abrir com um navegador de pastas e arquivos, como o Windows Explorer, a pasta do contexto que se está desenvolvendo para verificar se está tudo correto, ou mesmo para atualizar arquivos jsp, por exemplo. Aí que está o problema. Se no Windows um arquivo fica aberto em um notepad, por exemplo, toda a estrutura de diretórios fica presa pelo processo do notepad, e o tomcat falha ao tentar efetuar o undeploy. Parte dos arquivos são apagados, e outros tantos ficam para trás.

Depois de um processo de undeploy falho como este o context não estará mais disponível para consulta no seu browser, mas se o mesmo context for reinstalado com um deploy, é bem provável que problemas estranhos surjam. Conheço gente que faz um undeploy no tomcat, um clean no projeto do eclipse, outro clean no ant, fecha o tomcat, abre o tomcat e finalmente faz o deploy. Outros, menos superticioso se contentam em fechar e abrir o tomcat. Chamo este processo, tanto o completo quanto o resumido, de macumbate. Uma espécie de padrão no desenvolvimento java para web.

No meu linux eu não tenho este problema. Dificilmente fecho o tomcat, e quando o faço é porque preciso atualizar alguma biblioteca do common/lib ou porque já fiz algumas dezenas de deploy e ocorre um problema de espaço em memória (PermGen).

Discussão sobre padrão Struts

No guj está rolando uma discussão sobre o padrão de desenvolvimento web com struts 1.

http://www.guj.com.br/posts/list/58008.java

Eu não gosto do Struts 1 porque vejo todo mundo confuso com os conceitos dele, e simplesmente ignorando a maior parte das automatizações do framework.

Infelizmente ainda não vejo um novo padrão despontar no lugar do Struts 1. Como “os grandes” devem apontar para o Struts 2 ou jsf, estou estudando para entender melhor estes dois frameworks.

TV na internet com o Joost


Consegui uma senha de beta tester do Joost. Faz algumas semanas que eu enviei alguns emails aos colegas mais conectados implorando por um convite ao serviço Joost, mas não consegui. Tive de aguardar sair a senha pela fila de espera do site. O Joost é um serviço de TV sobre IP, ou seja programação em video distribuído pela internet. O programa é criação do autor de dois outros programas de sucesso, o Kazaa e o Skype.

O programa se encontra em versão beta e não há versão para linux: tive de experimentar o programa em um computador diferente da minha estação pessoal linux. Apesar de ser uma versão beta eu não encontrei nenhum bug sequer. Eu dei uma zapeada pelos canais e assisti a uma partida da final de um campeonato de Poker. Os programas ficam disponíveis para você assistir a hora que lhe for conveniente, e eventualmente é interrompido para exibir comerciais do Joost. O único inconveniente que encontrei foi esse, pois o Joost não espera um momento de intervalo para apresentar o comercial.

Fora isso o lag é muito pequeno, e só encontrei lag nos primeiros cinco ou dez segundos do programa, quando pode ocorrer um travamento enquanto o Joost carrega um cache do programa. Os programas disponíveis são relativamente poucos, mas vêm aumentando. Tem receitas culinárias, vários esportes, documentários e programas relacionados a música. Nota de curiosidade vai para o canal de Boliwood, pois eu sempre quis ter acesso a música indiana. Apesar das roupas serem exageradas, eu gosto das músicas.

Por fim, se você pretende se alistar na fila de beta tester, verifique antes se você dispõe de configuração necessária para rodar o programa. Menos que 512Mb de memória, por exemplo, é insuficiente, e uma boa conexão internet com limite de download adequado.