segunda-feira, 30 de abril de 2012

GNU Radio

GNU Radio 433MHz é um aplicativo que foi desenvolvido por Kevin Mehall e já está fazendo sucesso. O que chama atenção é que o aplicativo foi desenvolvido em Python e envia dados em forma de ondas de radio a cada 30 segundos com dados de temperatura, conforme a finalidade para a qual foi criada. O código não é muito grande e um fork está disponível no Github.

https://github.com/kevinmehall/rtlsdr-433m-sensor/tree/91f9d4b5e9854eb0051e7e26e6a71b062251ffdf

http://dangerousprototypes.com/2012/04/30/receiving-oregon-scientific-sensors-with-rtl-sdr/

If This Then That

Este aplicativo é muito interessante, com ele é possível fazer coisas como: se você enviar uma foto para o Instagram a foto seja enviada para o Dropbox; ou, se estiver chovendo em algum lugar que ele dispare um SMS. Esta tecnologia pode ser ainda mais interessante se um Arduino estiver conectado efetuando disparos.

http://ifttt.com/wtf



Solução para Envio Massivo de Email

As soluções para envio massivo de email são sempre restritas por causa do Spam. Porém algumas empresas possuem List Mail com um número grande de emails e precisam fazer alguma comunicação de marketing. O pessoal do Python Brasil ofereceu algumas soluções:

Celery

Send Mass Mail

Algumas vezes o servidor avisa que está sendo enviado um grande número de email e trata de encerrar a conexão. A solução do Rafael Feijó é um programa em Django Python que faz um loop enviando um email por  vez, e a cada tentativa faz uma verificação se não ocorreu falha na conexão.


  1. from django.db.models import Q
  2. from django.utils import uuid
  3. from django.core.mail import send_mail, EmailMessage, BadHeaderError, EmailMultiAlternatives
  4. from django.utils.html import strip_tags
  5. from common.dlog import LOG
  6. from common.lockfile import FileLock, AlreadyLocked, LockTimeout
  7. from socket import error as socket_error
  8. from datetime import datetime
  9. import time
  10. import smtplib
  11. import base64
  12. import sys
  13. import os
  14. try:
  15.     from django.core.validators import email_re
  16. except:
  17.     from django.forms.fields import email_re
  18. try:
  19.     from django.core.mail import get_connection
  20. except ImportError:
  21.     from django.core.mail import SMTPConnection
  22.     get_connection = lambda backend=None, fail_silently=False, **kwds: SMTPConnection(fail_silently=fail_silently)
  23. # lock timeout value. how long to wait for the lock to become available.
  24. # default behavior is to never wait for the lock to be available.
  25. LOCK_WAIT_TIMEOUT = getattr(web.settings, "MAILER_LOCK_WAIT_TIMEOUT", -1)
  26. # The actual backend to use for sending, defaulting to the Django default.
  27. EMAIL_BACKEND = getattr(web.settings, "EMAIL_BACKEND", "django.core.mail.backends.smtp.EmailBackend")
  28.         connection = None
  29.         ## emails é a lista de nome, email, id
  30.         for message in emails:
  31.             try:
  32.                 if connection is None:
  33.                     connection = get_connection(backend=EMAIL_BACKEND, **params)
  34.                 LOG.info("sending message '%s' to %s" % (message['nome'], message['email']) )
  35.                 email = message['email']
  36.                 html  = t.corpo_html
  37.                 text  = strip_tags(html)
  38.                 email_final = EmailMultiAlternatives(t.nome, text, params['username'], [email])
  39.                 email_final.attach_alternative(html, "text/html")
  40.                 r = connection.send_messages([email_final])
  41.             except (socket_error, smtplib.SMTPSenderRefused, smtplib.SMTPRecipientsRefused,smtplib.SMTPAuthenticationError), err:
  42.                 LOG.info("message deferred due to failure: %s" % err)
  43.                 connection = None


Não testei este programa mas já tive este problema em tempos anteriores, então já deixo disponível aqui no blog como kit de ferramentas.

Socket com NodeJS

Durante algum tempo procurei uma forma que fosse simples de desenvolver um Socket, porém o tempo mostrou que o melhor era desenvolver o programa no braço. O socket desenvolvido em Java precisa de no mínimo uma página de comandos. Atualmente a tecnologia NodeJS, com API's em Javascript vem surpreendendo. Com apenas algumas linhas de comando é possível utilizar uma API de Web Socket. 

Server
var io = require('socket.io').listen(80);

io.sockets.on('connection', function (socket) {
  socket.emit('news', { hello: 'world' });
  socket.on('my other event', function (data) {
    console.log(data);
  });
});


Client
<script src="/socket.io/socket.io.js"></script>
<script>
  var socket = io.connect('http://localhost');
  socket.on('news', function (data) {
    console.log(data);
    socket.emit('my other event', { my: 'data' });
  });
</script>


domingo, 29 de abril de 2012

SQL x NoSQL

A maioria dor profissionais de tecnologia ainda não conhecem ou não sabem o que é o NoSQL (Not Only SQL). O NoSQL, banco de dados não relacional, surgiu há aproximadamente 2 anos, com a ideia de se utilizar um formato de busca em banco de dados que evitasse o SQL injection. Seguem algumas diferenças básicas dos comandos utilizadas com NoSQL no MongoDB.





Segue a documentação do MongoDB:
http://www.mongodb.org/

http://www.mongodb.org/display/DOCS/Quickstart

http://docs.mongodb.org/manual/

http://www.mongodb.org/display/DOCS/Tutorial

Segue o site do Martin Fowler:
http://martinfowler.com/bliki/NosqlDefinition.html

sábado, 28 de abril de 2012

Instalação WEB2PY Ubuntu ou Crunchbang

Acompanhando as tendências de mercado é possível perceber uma grande evolução das ferramentas programadas com Python. O Python está chegando com mais força nesse momento graças ao desenvolvimento voltado à computação científica que deixa as outras linguagens pra trás, pelo fato dos usuários terem construído um grande número de API's  com baixa taxa de erro computacional. O Django é o framework voltado para web mais comum para o uso do Python, porém um framework mais simples e com curva de aprendizado mais baixa está crescendo em alta velocidade. Mais tarde comentarei as vantagens do uso do web2py para uso com banco de dados NoSQL e dispositivos móveis. Vamos à instalação:

Para Windows e Mac basta fazer o download do código executável para sua versão específica. No site:

http://www.web2py.com/

Para Linux deve-se escolher a versão Source que contém o código fonte. Faça o download e descompacte os arquivos no diretório que desejar.

Para uso no Linux é necessário instalar um pacote python-tk antes:

sudo apt-get install python-tk

Feito isso, deve-se acessar o diretório da pasta descompactada e executar no terminal:

python web2py.py

A instalação é instantânea, deve-se escolher uma senha para o aplicativo e logo em seguida o navegador abrirá pronto com sua aplicação criada. Para acessá-la, basta clicar no botão que indica a área do administrador e informar a senha no campo que será solicitado logo em seguida.

Finalizado, segue a imagem da área administrativa:





segunda-feira, 23 de abril de 2012

Montagem do Arduino Severino

Algumas semanas atrás fiz o teste do Arduino Severino. Como fiz a montagem sozinho o único componente que gerou dúvidas foi o capacitor C8 pelo fato do mesmo estar com o positivo aterrado que não é comum. Salvo a exceção de quando a tensão for negativa e nesse caso ele vai trabalhar no ciclo inverso. Porém essa filtragem só ocorre em um semiciclo, então o mais correto seria não utilizar o capacitor bipolar e sim o apolar (considerando-se a polaridade pelo sentido da tensão e não da corrente).

http://toxinavirtual.blogspot.com.br/2011/11/arduino-severino_25.html

Seguem as fotos da montagem:





A primeira surpresa foi descobrir que o ATMega328 já vem com o Sketch Blink gravado de fábrica, logo que liguei a fonte de 12V o led já começou a piscar. Cometi um segundo erro ao montar um cabo RS-232 comum conforme o link abaixo.

http://www.storesat.com/tvsatelite/rs232.asp

O cabo RS-232 é utilizado para ligar um computador ao outro. Como os conectores dos computadores são sempre DB9 macho então o cabo é feito por DB9 fêmea em ambos os lados. Tive que desmontar e fazer apenas uma extensão com um conector macho e outro fêmea.

No software utilizei o Crunchbang que é equivalente ao Ubuntu, porém estável. Para instalar a IDE do Arduino:

sudo apt-get install arduino

Para a execução da IDE basta chamar pelo nome no terminal, porém o ideal é acessar como usuário root para garantir que não haverá problemas de acesso às portas paralela, USB e serial:

sudo arduino

O jumper da serial deve estar conectado para habilitar a serial. O outro jumper é do reset automático e não cheguei a utilizar.

Para gravar o bootloader fiz a montagem do cabo da paralela:

http://www.arduino.cc/en/Hacking/ParallelProgrammer

Quando fui gravar o bootloader deixei o jumper do reset automático conectado e devo dizer que não foi uma boa ideia. O Bootloader foi apagado nesse momento e nenhum sketch subia mais para o Arduino. Coloquei o CI em uma placa de Arduino UNO e o Sketch também não subiu. Nesse momento ficou clara a diferença entre sketch e bootloader. Demorei um tempo tentando descobrir o erro. Este erro me levou a descobrir que pode existir algum problema de corrente durante esse processo de gravação do bootloader. É necessário selecionar a placa correta para o CI, no caso selecionar o Arduino UNO ou Duemilanove. Após várias tentativas saquei o jumper do reset automático e deu certo.

Descobri outro formato de cabo com valores de resistores diferentes, algumas pessoas relataram que só conseguiram a gravação do bootloader sacando alguns resistores.

http://www.dl1dow.de/inhalt/arduino/bootloader/e_arduino_bootloader.htm


Outro formato de AVR me chamou atenção durante a pesquisa:

http://electronics-diy.com/avr_programmer.php


Não tive tempo ainda para fazer mais testes, mas pretendo colocar o osciloscópio na serial para medir e verificar o formato da forma de onda durante o funcionamento da serial.

As tensões encontradas nos pinos:

1= GND
2= 0V
3= -9.5V
4= -4.4V


As tensões são negativas e vindas diretas da saída serial do computador.

Próxima etapa seria fazer uma breakout ou alteração na placa para utilizar cabo USB.



Gerando Etiquetas

A dica é da comunidade do Python Brasil onde surgiram dúvidas durante a última semana sobre softwares para gerar etiquetas. Existem vários softwares utilizados para isso: iReports, Django-Report, Geraldo Reports e ReportLab. Se for para usar com código de barras sugiro o iReports. O Geraldo é um pouco mais simples e usa o ReportLab por baixo. O ReportLab é bem customizável. Todos funcionam bem. Segue a documentação do ReportLab:

http://www.reportlab.com/software/documentation/

quarta-feira, 11 de abril de 2012

Crunchbang - Linux Estável

Algumas semanas atrás instalei uma versão leve do Ubuntu (9) e não consegui instalar nada dentro da distro, nem a Virtual Box. As versões do Ubuntu recebem atualizações instantâneas e por esse motivo é necessário utilizar sempre a última versão. Porém, a última atualização do Ubuntu (11) se tornou lenta para o tipo de máquina em que utilizo o sistema. O Crunchbang é a solução para este problema. Mais leve que o Ubuntu, porém completamente estável e atualizado. Após a instalação do Crunchbang um script automático é aberto em uma janela de terminal e todos os tipos de ferramentas de desenvolvimento são instaladas. MySQLServer, PHP5, PHPMyAdmin, Python, Java entre outras. O Crunchbang é da familia do Debian, assim como o Ubuntu, e tem as vantagens do comando "apt-get".



Para download
http://crunchbanglinux.org/

quarta-feira, 4 de abril de 2012

Envio de Email em Java

Acabei de configurar um programa para envio de email e já estou adicionando no ferramental do blog para que não seja necessário sempre vasculhar a internet para fazer algo simples, segue a referencia do programa no GUJ:

http://www.guj.com.br/java/104931-erro-no-teste-do-programa-para-envio-de-emails


  1. import java.net.MalformedURLException;  
  2. import java.net.URL;  
  3.   
  4. import org.apache.commons.mail.EmailAttachment;  
  5. import org.apache.commons.mail.EmailException;  
  6. import org.apache.commons.mail.HtmlEmail;  
  7. import org.apache.commons.mail.MultiPartEmail;  
  8. import org.apache.commons.mail.SimpleEmail;  
  9.   
  10. public class CommonsMail {  
  11.       
  12.     public CommonsMail() throws EmailException, MalformedURLException {  
  13.         enviaEmailSimples();  
  14.         enviaEmailComAnexo();  
  15.         enviaEmailFormatoHtml();  
  16.     }  
  17.       
  18.     /** 
  19.      * envia email simples(somente texto) 
  20.      * @throws EmailException 
  21.      */  
  22.     public void enviaEmailSimples() throws EmailException {  
  23.           
  24.         SimpleEmail email = new SimpleEmail();  
  25.         email.setHostName("smtp.gmail.com"); // o servidor SMTP para envio do e-mail  
  26.         email.addTo("teste@gmail.com""Guilherme"); //destinatário  
  27.         email.setFrom("teste@gmail.com""Eu"); // remetente  
  28.         email.setSubject("Teste -> Email simples"); // assunto do e-mail  
  29.         email.setMsg("Teste de Email utilizando commons-email"); //conteudo do e-mail  
  30.         email.setAuthentication("teste""xxxxx");  
  31.         email.setSmtpPort(465);  
  32.         email.setSSL(true);  
  33.         email.setTLS(true);  
  34.         email.send();     
  35.     }  
  36.       
  37.       
  38.     /** 
  39.      * envia email com arquivo anexo 
  40.      * @throws EmailException 
  41.      */  
  42.     public void enviaEmailComAnexo() throws EmailException{  
  43.           
  44.         // cria o anexo 1.  
  45.         EmailAttachment anexo1 = new EmailAttachment();  
  46.         anexo1.setPath("teste/teste.txt"); //caminho do arquivo (RAIZ_PROJETO/teste/teste.txt)  
  47.         anexo1.setDisposition(EmailAttachment.ATTACHMENT);  
  48.         anexo1.setDescription("Exemplo de arquivo anexo");  
  49.         anexo1.setName("teste.txt");          
  50.           
  51.         // cria o anexo 2.  
  52.         EmailAttachment anexo2 = new EmailAttachment();  
  53.         anexo2.setPath("teste/teste2.jsp"); //caminho do arquivo (RAIZ_PROJETO/teste/teste2.jsp)  
  54.         anexo2.setDisposition(EmailAttachment.ATTACHMENT);  
  55.         anexo2.setDescription("Exemplo de arquivo anexo");  
  56.         anexo2.setName("teste2.jsp");         
  57.           
  58.         // configura o email  
  59.         MultiPartEmail email = new MultiPartEmail();  
  60.         email.setHostName("smtp.gmail.com"); // o servidor SMTP para envio do e-mail  
  61.         email.addTo("teste@gmail.com""Guilherme"); //destinatário  
  62.         email.setFrom("teste@gmail.com""Eu"); // remetente  
  63.         email.setSubject("Teste -> Email com anexos"); // assunto do e-mail  
  64.         email.setMsg("Teste de Email utilizando commons-email"); //conteudo do e-mail  
  65.         email.setAuthentication("teste""xxxxx");  
  66.         email.setSmtpPort(465);  
  67.         email.setSSL(true);  
  68.         email.setTLS(true);  
  69.           
  70.         // adiciona arquivo(s) anexo(s)  
  71.         email.attach(anexo1);  
  72.         email.attach(anexo2);  
  73.         // envia o email  
  74.         email.send();  
  75.     }  
  76.       
  77.       
  78.     /** 
  79.      * Envia email no formato HTML 
  80.      * @throws EmailException  
  81.      * @throws MalformedURLException  
  82.      */  
  83.     public void enviaEmailFormatoHtml() throws EmailException, MalformedURLException {  
  84.           
  85.         HtmlEmail email = new HtmlEmail();  
  86.           
  87.         // adiciona uma imagem ao corpo da mensagem e retorna seu id  
  88.         URL url = new URL("http://www.apache.org/images/asf_logo_wide.gif");  
  89.         String cid = email.embed(url, "Apache logo");     
  90.           
  91.         // configura a mensagem para o formato HTML  
  92.         email.setHtmlMsg("<html>Logo do Apache - <img ></html>");  
  93.   
  94.         // configure uma mensagem alternativa caso o servidor não suporte HTML  
  95.         email.setTextMsg("Seu servidor de e-mail não suporta mensagem HTML");  
  96.           
  97.         email.setHostName("smtp.gmail.com"); // o servidor SMTP para envio do e-mail  
  98.         email.addTo("teste@gmail.com""Guilherme"); //destinatário  
  99.         email.setFrom("teste@gmail.com""Eu"); // remetente  
  100.         email.setSubject("Teste -> Html Email"); // assunto do e-mail  
  101.         email.setMsg("Teste de Email HTML utilizando commons-email"); //conteudo do e-mail  
  102.         email.setAuthentication("teste""xxxxx");  
  103.         email.setSmtpPort(465);  
  104.         email.setSSL(true);  
  105.         email.setTLS(true);  
  106.         // envia email  
  107.         email.send();  
  108.     }  
  109.       
  110.       
  111.     /** 
  112.      * @param args 
  113.      * @throws EmailException  
  114.      * @throws MalformedURLException  
  115.      */  
  116.     public static void main(String[] args) throws EmailException, MalformedURLException {  
  117.         new CommonsMail();  
  118.     }  
  119.   
  120. }  


API`s para download
http://commons.apache.org/email/download_email.cgi

http://www.oracle.com/technetwork/java/javasebusiness/downloads/java-archive-downloads-eeplat-419426.html#javamail-1.4.5-oth-JPR