SOPA + PIPA = O Fim da internet

O projeto SOPA (Stop Online Piracy Act, em português, Ato contra a pirataria online) junto com o outro projeto PIPA (Protect IP Act, em português, Ato de proteção de IP), ambos, projetos norte americanos podem acabar de vez com a … Continue lendo


Nenhum comentário.

Utilidade pública: Alertar veículo roubado

Recentemente recebi por email informando que o DPRF (Departamento de Polícia Rodoviária Federal) implantou um sistema para que as pessoas pudessem notificar roubo de carro. Resolvi averiguar e constatei que realmente a polícia gerou esse sistema! (Parabéns a eles por … Continue lendo


Nenhum comentário.

“Adobe ‘aposenta’ o flash para investir em tecnologia defendida pela Apple”

A Adobe, desenvolvedora de programas, divulgou em nota nesta quarta-feira (9) que não vai mais trabalhar no desenvolvimento da tecnologia flash, que permite a criação e execução de animações e vídeos em sites. A companhia afirmou que passará a investir … Continue lendo


Nenhum comentário.

“Conciliar negócio próprio com emprego fixo depende de ética”

“O consultor Eduardo Bom Angelo avalia o comportamento necessário para o profissional que deseja abrir uma empresa sem pedir demissão. Ele é um líder, trabalha bem em equipe, enxerga oportunidades e ajuda a empresa a crescer. O profissional intraempreendedor é … Continue lendo


Nenhum comentário.

“Estudante cria sistema que permite fazer pedidos na mesa da praça de alimentação”

O estudante australiano Stephen Davis criou um sistema que pode facilitar a vida de quem frequenta praças de alimentação. A Brand Table (Mesa das Marcas) usa a tecnologia NFC (Near Field Communication) para disponibilizar menus e realizar pedidos e pagamentos … Continue lendo


Nenhum comentário.

Introdução a Groovy e Grails na Semana da Computação UDESC

No dia 26/set pude apresentar um pouco de Groovy e Grails na Semana da Computação da UDESC. 

Segue slides da palestra.

Permalink | Leave a comment  »

Nenhum comentário.

Configurando Log4j para email de exceptions no Grails

O log4j tem um appender que envia emails chamado SMTPAppender. Nesse post eu vou mostrar como configurar esse appender no Grails.
Dessa forma sempre que for lançada uma exception não tratada você recebe um email com o erro e o stacktrace.
Encontrei essa solução aqui.

Pra fazer isso siga os passos.
1. Adicionar dependencia de mail.jar e activation.jar em BuildConfig.groovy

dependencies {
compile("javax.mail:mail:1.4.4")
compile("javax.activation:activation:1.1.1")
}
2. Alterar Config.groovy

import org.apache.log4j.Level
import org.apache.log4j.net.SMTPAppender

System.setProperty 'mail.smtp.port', '465'
System.setProperty 'mail.smtp.starttls.enable', 'true'

mail.error.server = 'smtp.gmail.com'
mail.error.port = 465
mail.error.username = 'seu@email.com'
mail.error.password = 'sua-senha-aqui'
mail.error.to = 'to@email.com'
mail.error.from = 'from@email.com'
mail.error.subject = '[Application Error]'
mail.error.starttls = true
mail.error.auth = true
mail.error.socketFactory.port = 465
mail.error.socketFactory.class = "javax.net.ssl.SSLSocketFactory"
mail.error.socketFactory.fallback = false
mail.error.debug = false

// log4j configuration
log4j = {

    System.setProperty 'mail.smtp.port', mail.error.port.toString()
  System.setProperty 'mail.smtp.starttls.enable', mail.error.starttls.toString()

  appenders {

     appender new SMTPAppender( name: 'smtp', to: mail.error.to, from: mail.error.from,        subject: mail.error.subject, threshold: Level.ERROR, SMTPHost: mail.error.server, SMTPUsername: mail.error.username, SMTPDebug: mail.error.debug.toString(), SMTPPassword: mail.error.password, layout: pattern(conversionPattern: '%d{[ dd.MM.yyyy HH:mm:ss.SSS]} [%t] %n%-5p %n%c %n%C %n %x %n %m%n'))
  }

  error  'org.codehaus.groovy.grails.web.servlet',  //  controllers
         'org.codehaus.groovy.grails.web.pages', //  GSP
         'org.codehaus.groovy.grails.web.sitemesh', //  layouts
         'org.codehaus.groovy.grails.web.mapping.filter', // URL mapping
         'org.codehaus.groovy.grails.web.mapping', // URL mapping
         'org.codehaus.groovy.grails.commons', // core / classloading
         'org.codehaus.groovy.grails.plugins', // plugins
         'org.codehaus.groovy.grails.orm.hibernate', // hibernate integration
         'org.springframework',
         'org.hibernate',
         'net.sf.ehcache.hibernate'
  warn   'org.mortbay.log'

  root {
     error 'stdout', 'smtp'
     additivity = true
  }
}

that's pretty much it

Permalink | Leave a comment  »

Nenhum comentário.

Sistema modular aplicando OSGI com Apache Felix

No início desse ano estive envolvido em um projeto onde um dos principais requisitos seria a flexibilidade de instalar, desinstalar, pausar e restartar módulos em tempo de execução sem precisar parar o sistema todo ou impactando o mínimo nos módulos já instalados. Isso especialmente porque o ciclo de vida de desenvolvimento desses módulos seriam independentes e por outras questões de ambiente. O sistema não podia crescer sendo um bloco monolítico. Ele precisava ter modularidade no seu DNA e os componentes deveriam funcionar mais como serviços que cooperariam entre si. 

Quando comecei a esboçar o núcleo do sistema percebi que o problema era mais comum do que havia imaginado inicialmente, foi quando lembrei que já existia uma solução pra isso e podia atender pelo nome de OSGi, ou Open Services Gateway Initiative, que apesar do nome pouco intuitivo é uma especificação para se criar sistemas modulares e orientados a serviços em Java.

A primeira versão da especificação saiu em 2000 e desde de então vem evoluindo e sendo empregada em aplicações como Eclipse, Glashfish e no ServiceMix. O que todas essas aplicações têem em comum é a capacidade de suportar e gerenciar plugins. Exatamente como no projeto em questão.

Os containers mais relevantes que eu encontrei na época foram o Apache Felix , Equinox e KnopflerfishBrincando um pouco com cada acabei escolhendo o projeto Apache pela facilidade.  Depois de fazer o download, pra iniciar o felix basta executar um jar.

java -jar bin/felix.jar

Executando o comando lb ele lista os componentes ativos (ou bundles como são chamados).

g! lb
START LEVEL 1
   ID|State      |Level|Name
    0|Active     |    0|System Bundle (3.0.0)
    1|Active     |    1|Apache Felix Bundle Repository (1.6.2)
    2|Active     |    1|Apache Felix Gogo Command (0.6.0)
    3|Active     |    1|Apache Felix Gogo Runtime (0.6.0)
    4|Active     |    1|Apache Felix Gogo Shell (0.6.0)

Agora com o Felix rodando só falta instalar um bundle próprio.

Basicamente a especificação pede que você informe meta-informações sobre o seu jar dentro do manifest. Se você usa Maven fica tudo mais fácil com o Maven Bundle Plugin. Com esse plugin você consegue definir no seu arquivo pom as informações para transformá-lo em um bundle OSGI.
O ciclo de vida de um bundle é gerenciado pelo container e você só precisa de uma classe que implemente a interface BundleActivator

package org.foo.myproject.impl1;

import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;

public class MyBundleActivator implements BundleActivator {

public void start(BundleContext bundleContext){
System.out.println("Olá! Eu sou um bundle ativo =) ");
}
public void stop(BundleContext context) {
System.out.println("Bye bye");
 }
}

Essa classe deve ser informada no manifest. Usando maven a configuração você adicionaria essa configuração no seu arquivo pom dessa maneira.

...
<plugins>
<plugin>
<groupId>org.apache.felix</groupId>
  <artifactId>maven-bundle-plugin</artifactId>
<extensions>true</extensions>
<configuration>
    <instructions>
      <Export-Package>org.foo.myproject.api</Export-Package> <!-- visível para outros bundles -->
       <Private-Package>org.foo.myproject.*</Private-Package>
        <Bundle-Activator>org.foo.myproject.impl1.MyBundleActivator</Bundle-Activator>
    </instructions>
</configuration>
</plugin>
</plugins>
...

Execute "mvn package" e pronto. 
Para instalar o novo bundle basta executar o comando install:

g! install file:/path/to/bundle/bundle.jar
g! lb
START LEVEL 1
   ID|State      |Level|Name
    0|Active     |    0|System Bundle (3.0.0)
    1|Active     |    1|Apache Felix Bundle Repository (1.6.2)
    2|Active     |    1|Apache Felix Gogo Command (0.6.0)
    3|Active     |    1|Apache Felix Gogo Runtime (0.6.0)
    4|Active     |    1|Apache Felix Gogo Shell (0.6.0)
    5|Installed  |    1|Example Bundle (1.0.0)
g! start 5
Olá! Eu sou um bundle ativo =) 
g!

Pesquisando mais a fundo o projeto descobri ainda um subprojeto chamado Apache Karaf que veio facilitar ainda mais o gerenciamento dos componentes. Basicamente é uma distribuição baseada no kernel do Apache Felix somando funcionalidades adicionais mais amigáveis para o gerenciamento dos bundles tais como console, interface web de administração, segurança, sistema de logging, configuração dinâmica, features, hot deployment e etc.

Hoje temos o Karaf rodando em ambiente de produção e cobrindo nossas necessidades.

O mais legal disso tudo é que você acaba tendo mais uma opção pra evitar usar um container pesado como um servidor de aplicação para disponibilizar seus componentes. Considere também um container OSGI a partir de agora. 

Permalink | Leave a comment  »

Nenhum comentário.

Mini curso Introdução a Desenvolvimento Web com Java da GlobalCode em Joinville

A Globalcode, através de sua parceira em Santa Catarina a V. Office, dará um mini curso introduzindo desenvolvimento web utilizando a tecnologia Java. Recomendo pra quem está pensando em ingressar na área sendo esse querendo entrar como analista ou desenvolvedor. … Continue lendo


Nenhum comentário.

Google cancela Google Desktop e outros produtos de seu portfólio

SÃO PAULO – Com a justificativa de que vai direcionar seu foco para projetos mais importantes, o Google anunciou que vai deixar de oferecer dez produtos de seu portfólio. Entre as iniciativas que serão canceladas, estão o Google Desktop, sistema … Continue lendo


Nenhum comentário.