07 dezembro 2010

e-Karros - Sistema de manutenção automotiva

No início do ano dei a notícia que iria iniciar um novo projeto e que em 1 mês daria mais detalhes. Bom, acontece que tive muita correria e acabei abandonando um pouco o blog, nem postei do que se tratava.

Esse projeto é o e-Karros, que já comentei sobre ele um pouco aqui. Nesse post falarei melhor sobre ele.

Quem tem carro e tenta manter sua manutenção em dia sabe que é bem complicado. Qualquer distração é suficiente para que esqueçamos de trocar o óleo do motor com a quilometragem certa. E aqueles adesivos que é colado no para-brisa do carro com as informações sobre a última manutenção e da futura manutenção? Pelo menos comigo eles sempre acabam esquecidos, isso quando não descolam e são perdidos.

Tendo essa dificuldade procurei uma opção de programa que me ajudasse com isso, porém não encontrei nada satisfatório, somente um online que peca por ter um gerenciamento fraco, e alguns para desktop, que são muito completos visando ser um controle de frota para empresas, e exatamente por isso são complexos demais.

A ideia era ter um sistema simples, que pudesse ter um gerenciamento das manutenções do carro de forma fácil, podendo adicionar, alterar e excluir qualquer manutenção que eu quisesse, e que fosse online. Assim nasceu o e-Karros.

Nos últimos meses venho trabalhando nele. O "lançamento" do sistema foi a pouco menos de 3 meses. Coloquei lançamento entre aspas pois não fiz muita divulgação do sistema, limitando-se a um tópico no fórum do Corsa Clube, o que levou ao cadastro de pouco mais de 100 usuários. É pouco, mas até que anima pelo fato de ver que as pessoas ao menos tem interesse no sistema.
As funcionalidades atuais do sistema são:
  • Cadastro de carros - é possível cadastrar até 3 carros. Além dos itens mais comuns encontrado nos carros, é possível adicionar acessórios ao carro, além de uma imagem para o carro;
  • Agendamento de manutenções - agenda os serviços de manutenção para o carro. Se um serviço já foi previamente realizado o sistema busca a última ocorrência. É possível também que o sistema calcule a data do próximo serviço de manutenção de com base na última realização do serviço, e nos dados do carro. O sistema envia um e-mail informando da proximidade de um serviço 3 dias antes da data agendada.
Como disse, é um sistema simples. Mas ainda não está nem perto do que gostaria que o sistema fosse. Mas estou trabalhando para chegar lá ;-).

Conforme for adicionando novas funcionalidades no sistema informarei aqui.

25 novembro 2010

Adicionar SyntaxHighlighter no Blogger

Ao iniciar o último posta, com a necessidade de postar trechos de código java, fui procurar uma forma de inserir caixas de código aqui no blogguer e acabei encontrando o SyntaxHighlighter.

O link para um tutorial de como instalá-lo no blogger é encontrado aqui: http://explicacaodanet.blogspot.com/2010/03/adicionar-syntaxhighlighter-no-blogger.html.

Appengine - Armazenando arquivos no Datastore

Já faz algum tempo em que eu tenho utilizado o Google App Engine para desenvolver meus projetos pessoais em Java, que atualmente o maior é o e-Karros. Apesar dos vários benefícios da plataforma, existem alguns pontos que trazem dificuldades ao desenvolvimento. A dificuldade mais recente que encontrei foi o armazenamento de arquivos no Datastore do App Engine. No meu caso específico foi o armazenamento de imagens. Após um bom tempo de pesquisa na net encontrei a solução abaixo.

Para podermos armazenar arquivos precisamos utilizar o tipo de dado Blob, através da API Blobstore. Bom, em primeiro lugar temos que criar nossa classe que irá armazenar o arquivo, que neste caso pode ser uma imagem:
import javax.jdo.annotations.IdGeneratorStrategy;
import javax.jdo.annotations.IdentityType;
import javax.jdo.annotations.PersistenceCapable;
import javax.jdo.annotations.Persistent;
import javax.jdo.annotations.PrimaryKey;
import com.google.appengine.api.datastore.Blob;

@PersistenceCapable(identityType = IdentityType.APPLICATION)
public class Imagem {
    @PrimaryKey
    @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
    private Long id;

    @Persistent
    private Blob imagem;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public void setImagem(Blob imagem) {
        this.imagem = imagem;
    }

    public Blob getImagem() {
        return imagem;
    }
       
    public void adiciona() throws Exception {
        new ImagemDAO().adiciona(this);
    }

    public ImagemCarro buscaImagem(Long id) {
        return new ImagemDAO().buscaImagem(id);
    }
}

Vamos supor que nossa classe ImagemDAO já esteja implementada.

Após isso temos nossa classe Servlet que irá receber o arquivo que foi feito upload, tratá-lo e chamar o método de gravação. Para se "caputrar" o arquivo e converter para o formato da classe Blob (array de bytes), precisando da biblioteca Commons IOUtils, da Apache.

import org.apache.commons.io.IOUtils;

public class ArmazenaImagem extends HttpServlet {
 
    public void doPost(HttpServletRequest req, HttpServletResponse resp) {
        try {
            InputStream imgStream = req.getInputStream();
            Blob imageBlob = new Blob(IOUtils.toByteArray(imgStream));

            Imagem img = new Imagem();
            img.setImagem(imageBlob);

            img.adiciona();

            resp.setStatus(HttpServletResponse.SC_OK);
            resp.setContentType("text/plain");
            resp.getWriter().println( "{success: true}" );

        } catch (Exception e {
            e.printStackTrace();
            resp.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
            resp.setContentType("text/plain");
            resp.getWriter().println( "{success: false}" );
        }
    }
}
Como podemos ver, é bem simples gravar um arquivo no Datastore.

Aqui uma pausa para explicar a linha resp.getWriter().println( "{success: true}" ); e seu equivalente no bloco catch. É um requerimento da plugin JavaScript Ajax Upload, o melhor que encontrei para esse trabalho ;-). A utilização de um plugin para upload foi a única forma que eu encontrei para enviar o arquivo ao servidor utilizando AJAX, porém ainda estou a procura de uma outra forma.

A recuperação da imagem é igualmente simples. Abaixo segue o servlet:
public class BuscaIMagemServlet extends HttpServlet {
    public void doGet(HttpServletRequest req, HttpServletResponse resp) {
        try {
            resp.setContentType("image/jpeg");
            resp.setHeader("Content-Disposition","inline");
   
            Long id = Long.parseLong( req.getParameter( "id" ) );
            Imagem imagem = new Imagem().buscaImagem(ido);
   
            Blob blobImagem = imagem.getImagem();
            byte[] btImg = blobImagem.getBytes();
   
            resp.getOutputStream().write(btImg);
   
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
É somente isso. Ao recuperarmos a imagem do Datastore precisamos transformá-la em um array de bytes.

Nesse caso usei o campo id para recuperar uma imagem específica. Para exibir a imagem na página precisamos inserir a tag img em nossa página:
Sem Imagem
Onde '/buscaImagem?id=1' é o nosso servlet que recupera a imagem, e id=1 é o parâmetro para buscarmos uma imagem específica (o número 1 q coloquei é só um exemplo).

Espero que este breve tutorial sirva para que outras pessoas não fiquem batendo tanta cabeça quanto eu ;-).

19 outubro 2010

Início de nova fase

Já faz algum tempo que venho notando que a quantidade de micro empresas, principalmente pequenos estabelecimentos comerciais vem aumentando bastante. Com isso fica em evidencia uma área bem interessante para atuar como técnico ou consultor de informática.

Bom, geralmente essas empresas, por seu porte, não tem necessidade de um profissional de TI trabalhando 100% dedicado para atende-la, e isso nem seria praticável. Mas com isso aparece um problema: algumas dessas empresas não veem o benefício que a orientação de um profissional de TI pode trazer para a empresa. Dessa forma costumamos ver muitas empresas subutilizando recursos de informática ou mesmo não utilizando nem mesmo um computador.

Vendo este cenário conclui que uma boa opção para direcionar minha carreira é focando essas empresas, oferecendo-lhes serviços na área de informática com qualidade, que vão desde a simples manutenção de computadores até desenvolvimento de sistemas, passando pela orientação de qual tecnologia a empresa deve adquirir.

Esse é o novo foco que estou dando para minha carreira, e acredito que posso ter sucesso nesse caminho ajudando essas empresas a também alcançar o sucesso.

26 maio 2010

Alterar nome da interface de rede no Linux

Acabo de precisar alterar alterar o nome das interfaces de rede do servidor que estou preparando. Como não sabia, uma pesquisa rápida me levou a essa pequena dica http://www.vivaolinux.com.br/dica/Alterar-nome-de-interface-de-rede-eth0-para-eth1-e-vice-versa/

Muito fácil.

08 janeiro 2010

Mudança na hospedagem do Econodin

Depois de algum tempo sem postar nada, aqui estou eu novamente.

Depois do fim das aulas me dediquei a mudança de hospedagem do Econodin já que tive alguns problema técnicos com a antiga hospedagem. E a hospedagem que escolhi foi o Google Appengine. Os motivos principais foram 2: gratuidade do serviço enquanto é pouco utilizado e estabilidade do serviço. Apesar de haverem restrições quanto a recursos do Java que podem ser utilizados (como descrito neste post no blog da Caelum), só o fato de não precisar se preocupar com infra estrutura de produção e escalabilidade para rodar um sistema já compensa todo o trabalho de migração, ainda mais se você trabalha sozinho ;-). E por falar em migração, sim, foi trabalhosa. Tive que alterar muitas coisas, principalmente relacionada a persistência de dados, mas valeu a pena, e ainda aproveitei para revisar e melhorar o código.

Agora sobre o Econodin, as principais mudanças para usuários é que agora para utilizar o sistema basta ter uma conta Google, não é necessário fazer mais um cadastro. Essa é uma das grandes vantagens de se utilizar a plataforma da Google. A outra novidade é a implementação de lançamentos automáticos, isto é, você cadastra os lançamentos que você quer que sejam feitos mensalmente ou anualmente e, para adicioná-los a um mês, basta apenas clicar em um botão. Acredito que essa facilidade seja fundamental para a utilização do sistema.

Por hora essas são as novidades. Para o próximo mês espero já ter mais uma novidade para vocês, um novo projeto que pretendo iniciar nas próximas semanas.