Rodrigo Guedes de Souza

Desenvolvedor e apaixonado por tecnologia.

Autocomplete Comandos Do Git Em Seu Terminal Mac OS

No termina/shell do Mac OS X você pode usar [TAB] para autocompletar caminhos de arquivos e diretórios. Já imaginou como seria incrível se pudesse usar essa mesma função para comandos git assim como nome de branches?

Então você pode!!! Veja como.

O primeiro passo é baixar o script git-completion.bash (veja aqui) em seu diretório raiz executando o seguinte comando:

1
curl https://raw.githubusercontent.com/git/git/master/contrib/completion/git-completion.bash -o ~/.git-completion.bash

O próximo passo é adicionar o código abaixo em seu arquivo ~/.bash_profile. Este trecho de código executa o script git autocomplete caso ele exista.

1
2
3
if [ -f ~/.git-completion.bash ]; then
  . ~/.git-completion.bash
fi

Agora abra um novo shell, vá para um diretório que contenha um repositório git e comece a digitar um comando. Agora você pode usar [TAB] para autocompletar comandos do git e nomes de branch.

Por exemplo, se você digitar git + espaço + [TAB], você vai ter como resultado uma lista contendo todos os comandos disponíveis do git:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
add                      config                   instaweb                 reset
am                       credential               log                      revert
annotate                 credential-osxkeychain   merge                    rm
apply                    describe                 mergetool                send-email
archive                  diff                     mv                       shortlog
bisect                   difftool                 name-rev                 show
blame                    fetch                    notes                    show-branch
branch                   filter-branch            p4                       stage
bundle                   format-patch             pull                     stash
checkout                 fsck                     push                     status
cherry                   gc                       rebase                   submodule
cherry-pick              get-tar-commit-id        reflog                   subtree
citool                   grep                     relink                   svn
clean                    gui                      remote                   tag
clone                    help                     repack                   whatchanged
column                   imap-send                replace
commit                   init                     request-pull

A brincadeira fica ainda mais interessante quando você trabalha com várias branches. O processo de checkout e push fica bem mais rápido!!! Bom, isso para quem gosta de linhas de comandos ;)

Desenvolvimento De Uma Aplicação Frente De Caixa Automatizada Para O Varejo Utilizando JAVA E RFID

Segue mais um post onde disponibilizo minha monografia realizada na Especialização em Desenvolvimento Orientado a Objetos em JAVA. A proposta dessa monografia foi realizar um levantamento bibliográfico sobre a tecnologia RFID e utilizá-la com a plataforma Java para resolver um grande problema enfrentado pelo setor varejista.

RESUMO

As longas filas nos caixas, do setor varejista, é um dos diversos fatores que causam constrangimentos e insatisfações a consumidores modernos, que esperam por um rápido atendimento na hora de efetuar suas compras. Por este motivo os clientes procuram outros estabelecimentos, na busca de acharem um ambiente ideal, sem transtornos. Deste modo um processo automatizado auxilia efetuar vendas rápidas e eficientes trazendo lucros para o negócio e satisfazendo o desejo do cliente. Neste momento a utilização da tecnologia de identificação por rádio freqüência (RFID) é primordial, pois ela elimina a entrada de dados manuais tornando o processo de efetuação de venda mais rápida e precisa. Este trabalho tem, portanto, o objetivo de realizar um estudo sobre a tecnologia de identificação por rádio freqüência e o Middleware SUN JAVA SYSTEM RFID para utilizarem como ferramentas. A partir dos resultados obtidos neste estudo, será desenvolvida uma aplicação desktop frente de caixa específica para o varejo, desenvolvido em JAVA para agilizar o processamento dos itens de venda, minimizando o problema das grandes filas de caixas.

Palavras chave: Identificação por Rádio Freqüência, JAVA, Fila de Caixa.

Aluno: Rodrigo Guedes de Souza (rodrigo@guedesdesouza.com.br) Orientação: Prof. Msc. Edson Yanaga (yanaga@cesumar.br)

Download Aqui…

Estudo Sobre a Implantação De Propriedades De Segurança Em Correio Eletrônico Através Do PGP

Para aqueles que querem proteger suas informações enviadas por email, segue minha monografia para o curso de Especialização em Ambientes de Desenvolvimento para Internet. Apesar de ter escrito há alguns anos ainda é uma ótima fonte de referência.

RESUMO

O correio eletrônico (email) é um dos melhores exemplos da onipresença que a Internet apresenta no cotidiano da sociedade moderna. Entretanto, muito embora já considerado um serviço essencial, o correio eletrônico é inerentemente inseguro. A despeito da ignorância da grande maioria dos usuários, o correio eletrônico, como utilizado comumente (através da RFC 822) não é capaz de garantir a entrega, a privacidade, a autenticação e o não repúdio das mensagens enviadas. A utilização de aplicações como o PGP, que permitem acrescentar propriedades de segurança ao correio eletrônico, têm se demonstrado de mínimo grau de penetração junto à comunidade da Internet. Este trabalho tem portanto o objetivo de realizar um estudo sobre a implantação de propriedades de segurança em correio eletrônico através de uma aplicação baseada em criptografia, cujo representante mais popular é o PGP. A partir dos resultados obtidos com este estudo, esperase poder divulgar e fornecer uma trilha para servir de guia à popularização dos serviços de segurança em correio eletrônico.

Palavraschave: Segurança, correio eletrônico, PGP.

Aluno: Rodrigo Guedes de Souza (rodrigo@guedesdesouza.com.br) Orientação: Prof. Msc. Edson Yanaga (yanaga@cesumar.br)

Download Aqui…

Utilizando Captcha Com Servlet

Um assunto muito interessante que eu trato neste post, é como utilizar captcha para manter seguro seu site contra robôs da web e ataques.

O que é um Robô da Web

ROBOT (ou robô) é um programa de computador que percorre automaticamente as páginas da Internet em busca de documentos, a fim de indexá-los, validá-los ou monitorar alterações de conteúdo. Wikipedia

O que é DDos-Spam

Um ataque de negação de serviço (também conhecido como DoS, um acrônimo em inglês para Denial of Service), é uma tentativa em tornar os recursos de um sistema indisponíveis para seus utilizadores. Alvos típicos são servidores web, e o ataque tenta tornar as páginas hospedadas indisponíveis na WWW. Não se trata de uma invasão do sistema, mas sim da sua invalidação por sobrecarga. Wikipedia

O que é Captcha

CAPTCHA é um acrônimo para “Completely Automated Public Turing test to tell Computers and Humans Apart” (teste de Turing público completamente automatizado para diferenciar entre computadores e humanos) desenvolvido pela universidade do Carnegie-Mellon.

CAPTCHAs são utilizados para impedir que softwares automatizados execute ações que degradam a qualidade do serviço de um sistema dado, devido à despesa do abuso ou do recurso. Embora CAPTCHAs sejam utilizados mais frequentemente como uma resposta a proteção de interesses comerciais, a noção que existem para parar somente spammers é um erro, ou uma simples redução. Wikipedia

API Disponíveis Atualmente as apis mais utilizadas, freqüentemente, em sistemas em java são:

Simple Captcha http://simplecaptcha.sourceforge.net Última Atualização 25/09/2005

JCaptcha http://jcaptcha.sourceforge.net Última Atualização 03/05/2007

SkewPassImage http://skewpassim.sourceforge.net Última Atualização 27/03/2006

Recaptcha http://www.recaptcha.net

Implementação Uma situação real em que pode ser utilizado a captcha, é em um cadastro de usuário em um fórum, por exemplo, imagine se não existir um método que empeça de um cracker ou um aplicativo robô, derrubar seu site de tanto emitir submissões de cadastros de usuário “Ataque por DDos-spam”. Isso poderia gerar um excessivo uso de recursos desnecessário do servidor. Para nossa implementação eu escolho o Jcaptcha, pois na minha opinião é a API mais completa para se trabalhar com Java.

CaptchaServiceSingleton.java
1
2
3
4
5
6
7
8
9
10
11
12
13
package br.com.guedesdesouza.captcha;

import com.octo.captcha.service.image.ImageCaptchaService;
import com.octo.captcha.service.image.DefaultManageableImageCaptchaService;

public class CaptchaServiceSingleton {

    private static ImageCaptchaService instance = new DefaultManageableImageCaptchaService();

    public static ImageCaptchaService getInstance(){
        return instance;
    }
}
GeraCaptchaServlet.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
package br.com.guedesdesouza.captcha;

import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.IOException;

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.octo.captcha.service.CaptchaServiceException;
import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGImageEncoder;

public class GeraCaptchaServlet extends HttpServlet {

    @Override
    public void init(ServletConfig config) throws ServletException {
      super.init(config);
  }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {
      byte[] captchaChallengeAsJpeg = null;
      // Objeto que receber a imagem jpeg gerada pelo JCaptcha
      // retorna para solicitação do cliente
      ByteArrayOutputStream jpegOutputStream = new ByteArrayOutputStream();
      try {
          // Pega o id da sessao para utiliza como identificador
          // para geração do captcha
          String captchaId = req.getSession().getId();
          // chama o método de geração de captcha
          BufferedImage challenge = CaptchaServiceSingleton.getInstance().getImageChallengeForID(captchaId,req.getLocale());

          // codifica a imagem para tipo jpeg
          JPEGImageEncoder jpegEncoder = JPEGCodec.createJPEGEncoder(jpegOutputStream);
          jpegEncoder.encode(challenge);
      } catch (IllegalArgumentException e) {
          resp.sendError(HttpServletResponse.SC_NOT_FOUND);
          return;
      } catch (CaptchaServiceException e) {
          resp.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
          return;
      }

      captchaChallengeAsJpeg = jpegOutputStream.toByteArray();

      // enviar a resposta com a imagem
      resp.setHeader("Cache-Control", "no-store");
      resp.setHeader("Pragma", "no-cache");
      resp.setDateHeader("Expires", 0);
      resp.setContentType("image/jpeg");
      ServletOutputStream responseOutputStream = resp.getOutputStream();
      responseOutputStream.write(captchaChallengeAsJpeg);
      responseOutputStream.flush();
      responseOutputStream.close();
  }
}
ValidaCaptchaRegistroServlet.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
package br.com.guedesdesouza.captcha;

import java.io.IOException;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class ValidaCaptchaRegistroServlet extends HttpServlet{

  @Override
  protected void doPost(HttpServletRequest req, HttpServletResponse resp)
      throws ServletException, IOException {
  
      String resposta = req.getParameter("captcha.id");
      String idCaptcha = req.getSession().getId();
      
      RequestDispatcher rd = null;
      
      if (isValido(resposta, idCaptcha)){//se verdadeiro conclui cadastro
          rd = getServletContext().getRequestDispatcher("/concluido.jsp");
          rd.forward(req, resp);
      }else{// caso seja inválido retorna a página de registro
          req.setAttribute("msg","Texto da imagem digitado errado");
          rd = getServletContext().getRequestDispatcher("/registrar.jsp");
          rd.forward(req, resp);
      }
  }
      
  private boolean isValido(String resposta, String idCaptcha){
      boolean resultado = false;
      try{
          resultado = CaptchaServiceSingleton.getInstance().validateResponseForID(idCaptcha,resposta);
      }catch (Exception e) {
          // TODO: handle exception
      }
      return resultado;
  }
}
registro.jsp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
<?xml version="1.0" encoding="ISO-8859-1" ?>
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="f" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
<style type="text/css">@import url( http://styles/style.css);</style>
<title>Registrar</title>
</head>
<body>

<form name="formregister" action="validacaptcha" method="post">
<table class="forumline" cellspacing="1" cellpadding="3" width="50%" border="0" align="center">
<tr>
<th class="thhead" valign="middle" colspan="2" height="25">Registrar Informação</th>
</tr>

<tr>
<td class="row2" colspan="2" align="center"><span class="gensmall"><font color="red">Você deve preencher os campos com "*"</font></span></td>

</tr>

<tr>
<td class="row1" width="38%" align="right">Usuário: *</td>
<td class="row2"><input class="post" type="text" style="WIDTH: 200px" maxlength="25" size="25" name="username" value=""/></td>
</tr>

<tr>
<td class="row1" align="right">Endereço de e-mail: *</td>
<td class="row2"><input class="post" type="text" style="WIDTH: 200px" maxlength="255" size="25" name="email" value=""/></td>

</tr>

<tr>
<td class="row1" align="right">Senha: *</td>
<td class="row2"><input name="password" type="password" class="post" id="password" style="WIDTH: 200px" size="25" maxlength="100" /> </td>
</tr>

<tr>
<td class="row1" align="right">Confirme a senha: *</td>

<td class="row2"><input class="post" style="WIDTH: 200px" type="password" maxlength="100" size="25" name="password_confirm" /> </td>
</tr>

<tr>
<td class="row1" align="right"></td>
<td class="row2"><img src="geracaptcha" /></td>
</tr>

<tr>
<td class="row1" align="right">Digite o texto da image: *</td>

<td class="row2"><input class="post" type="text" style="WIDTH: 200px" maxlength="7" size="25" name="captcha.id" value=""/></td>
</tr>

<tr>
<td class="row2" colspan="2" align="center"><font color="#ff0000"><b>
<c:out value="${msg}"></c:out>
</b></font></td>
</tr>

<tr align="center">
<td class="catbottom" colspan="2" height="28">
<input class="mainoption" type="submit" value="Enviar" name="submit" />
<input class="liteoption" type="reset" value="Limpar" name="reset" />
</td>
</tr>
</table>
</form>
</body>
</html>
concluido.jsp
1
2
3
4
5
6
7
8
9
10
11
12
13
<?xml version="1.0" encoding="ISO-8859-1" ?>
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
<title>Registro Concluído</title>
</head>
<body>
Registro Concluído...
</body>
</html>
web.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_ID" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<display-name>captcha</display-name>

<servlet>
<servlet-name>geracaptchaServlet</servlet-name>
<servlet-class>br.com.guedesdesouza.captcha.GeraCaptchaServlet</servlet-class>
<load-on-startup>0</load-on-startup>
</servlet>

<servlet>
<servlet-name>validacaptchaServlet</servlet-name>
<servlet-class>br.com.guedesdesouza.captcha.ValidaCaptchaRegistroServlet</servlet-class>
<load-on-startup>0</load-on-startup>
</servlet>

<servlet-mapping>
<servlet-name>geracaptchaServlet</servlet-name>
<url-pattern>/geracaptcha</url-pattern>
</servlet-mapping>

<servlet-mapping>
<servlet-name>validacaptchaServlet</servlet-name>
<url-pattern>/validacaptcha</url-pattern>
</servlet-mapping>

</web-app>

E o resultado é esse:

Apesar de um captcha ser útil para minimizar os problemas de ataque ou vasculhamento de informações por robôs dos grandes motores de buscas da internet e garantir que somente seres humanos possa responder as peguntas geradas, ele também tem uma problema: Como o captcha se baseia na geração de imagens para definição da pergunta, isso se torna um empecilho para usuário com deficiências visuais, pois, para que possam navegar na internet, utilizam-se de software especializados em ler o conteúdo do html e como determinado software não consegue ler a imagem gerada, o deficiente acaba não tendo acesso sobre o conteúdo.Num próximo post irei um pouco mais a fundo do Jcaptcha para podermos utilizar alguns recursos personalizados. Código Fonte em: https://github.com/gulira/captcha

Configurando Wireless No Ubuntu Para Notebook HP Pavilion Dv2610us

Após migrar meu notebook (HP dv2610us) para Ubuntu 7.10, a única coisa que me deixava a desejar era o funcionamento do wireless, após vários e vários dias pesquisando e testando diversos drivers e maneiras de reconhecer a mini-PCI Broadcom 94311 que vem junto a ele, consegui finalmente desfrutar do acesso wireless via Linux.

Abaixo segue um breve tutorial de como fazer essa mágica:

1° Passo: (Instalar o ndiswrapper)

Ndiswrapper é um emulador de drivers Windows para Linux, seu principal objetivo é fazer com que hardware baseado em Windows possam ser ativado no Linux. Ele também pode ser utilizado para outros hardware além de dispositivos wireless como: WebCam, Modems e Roteadores USB entre outros.

Para instalar o ndiswrapper é só entrar no seu terminal e digitar:

$ sudo apt-get install ndiswrapper-common

e

$ sudo apt-get install ndiswrapper-utils-1.9

2° Passo: (Desabilitar o driver nativo pre-instalado) No Ubuntu já existe um drive Broadcom 43xx previamente instalado que deve ser removido pelo simples motivo de não funcionar para a mini-PCI que vem junto ao dv2610us.

Para desabilitar execute o seguinte comando

$ echo ‘blacklist bcm43xx’ | sudo tee -a /etc/modprobe.d/blacklist

e

$ sudo rmmod bcm43xx

3° Passo: (Baixar o drive Broadcom compatível) Esse é o ponto que me deixa mais indignado, pela lógica e muito provavelmente, você deve estar imaginando “isso se você já não foi logo fazendo :) ” é só ir na site da HP e fazer o download do drive disponível para esse módulo e pronto!!! É ai que você se engana hehehe. Não sei por qual motivo o drive da HP que deveria funcionar não funciona, então, após vários dias de pesquisa, encontrei um site “segue link no final do post” que ensinava a instalar essa mesma mini-PCI com o drive da Dell e então após os meus testes…… Uhuuu, funcionou.

Então para fazer o download

$ wget http://ftp.us.dell.com/network/R151517.EXE

Após o download temos que descompactar

$ unzip -a R151517.EXE

4° Passo: (Instalar e ativar o drive no ndiswrapper) Após descompactar em um diretório temporário, por exemplo “temp”, execute os comandos:

$ sudo ndiswrapper -i temp/DRIVE/bcmwl5.sys

E depois temos que iniciar o módulo

$ sudo ndiswrapper -m

$ sed -e ‘s/RadioState|1/RadioState|0/’ /etc/ndiswrapper/bcmwl5/*.con

$ sudo modprobe ndiswrapper

Reinicie o computador para verificar se realmente o ndiswrapper carregou automática e execute o seguinte comando para listar os pontos de acesso wireless

$ iwlist scanning

6° e Último Passo: (configurando a rede) Como todo bom usuário Linux, configure a rede na mão com os seguinte comandos:

$ sudo iwconfig wlan0 essid NOME_DO_ACESSPOINT “nome listado pelo comando iwlist scanning”

$ sudo iwconfig wlan0 enc CHAVE “chave de acesso se utiliza WEP ou WPA – opcional caso venha utilizar rede segura ou pelo menos difícil de quebrar” $ sudo dhclient wlan0 “configura para pegar automaticamente um ip fornecido pelo acess point”

$ sudo ifconfig wlan0 down “desliga interface wlan0”**

$ sudo ifconfig wlan0 up “inicia interface wlan0”**

$ sudo iwconfig commit “grava alterações”**

E pronto, você já está liberado para utilizar sua rede wireless.

Referência: http://www.vivaolinux.com.br/dicas/verDica.php?codigo=9358