Saturday, March 17, 2012

Gerar hash SHA-256 no terminal do linux

Comando útil para gerar hash SHA-256, por exemplo, a partir do terminal do linux:

> echo -n conteudo_a_cifrar | sha256sum

É só o valor adequado, ao invés de conteudo_a_cifrar, e pronto. O comando gera na saída o hash SHA-256.

@edermag
www.yaw.com.br

Friday, March 16, 2012

Projeto demonstração do Java 7

Subi no github o projeto com os fontes demonstrando as novidades do Java 7. Esse projeto nasceu junto com o minicurso JDK7 - Modificações na linguagem.

No código disponibilizei exemplos com os tópicos:
  • Separador de liteiras numéricas _
  • Operador switch com suporte a String
  • Operador Diamond (Generics)
  • AutoCloseable, o novo try-finally
  • Multicatch
  • Rethrow
  • JDBC 4.1
  • Nova API de IO (NIO.2)
  • @SafeVargs: Varargs com Generics

@edermag
www.yaw.com.br

Friday, January 20, 2012

Como redirecionar URL com Django

Implementar o redirecionamento de url's com Django é extremamente simples! Basta utilizar a função django.views.generic.simple.redirect_to no arquivo de configurações para urls (ROOT_URLCONF).

Um exemplo do site da yaw:
from django.views.generic.simple import redirect_to


urlpatterns = patterns('',
  ...
 (r'^treinamentos/academiaJava.html/$', redirect_to, {'url': '/treinamentos/academia_java/'}),
  ...
)

Dessa forma quando a url http://www.yaw.com.br/treinamentos/academiaJava.html for requisitada o Django retorna para o browser o código http 301 (Moved Permanently), redirecionando para a página http://www.yaw.com.br/treinamentos/academia_java.

Simples!


@edermag
www.yaw.com.br

Thursday, November 17, 2011

Instalação (manual) do Java 7 no Ubuntu 11 64 bits


Roteiro para instalar o Kit de desenvolvimento do Java (JDK) 7 no Ubuntu 11 64 bits, de forma manual, baixando o pacote do jdk7 direto do site da Oracle.

Baixe o tar com o pacote de binários do site da Oracle.

Depois é só colocar o arquivo na pasta /usr/lib/jvm e extrair o tar, por exemplo (meu arquivo é jdk-7u1-linux-x64.tar.gz):

sudo mv /home/yaw/Download/jdk-7u1-linux-x64.tar.gz /usr/lib/jvm/jdk-7u1-linux-x64.tar.gz
tar -zvxf jdk-7u1-linux-x64.tar.gz

Próxima etapa é configurar o ambiente, isso pode ser feito também de forma manual editando o arquivo bashrc:

sudo vim /home/yaw/.bashrc

Outra opção seria realizar a configuração através do comando update-alternatives. A seguir a instrução que abre o menu com opções de atualização do Java.


sudo update-alternatives --config java

Provavelmente existem três, começando com a Selection 0, não selecione nenhuma, saia com enter.

O comando a seguir cria a quarta opção, Selection 3, apontando para a pasta do Java 7:


sudo update-alternatives --install /usr/bin/java java /usr/lib/jvm/jdk1.7.0/jre/bin/java 3

Rode novamente o comando para atualizar o Java:

sudo update-alternatives --config java

Escolha a Selection 3 (a mesma que vc criou para o Java 7).


Pronto, fácil.

@edermag
www.yaw.com.br

Thursday, November 03, 2011

O TDC2011 foi tri-sucesso

Não poderia deixar de escrever sobre a tri-participação da YaW no The Developer’s Conference 2011, conhecido como o TDC2011. Copiando uma frase da Yara: “somos 100% TDC2011”, presentes na edição São Paulo, Florianópolis e Goiânia.

Florianópolis

O evento em Florianópolis contou com 12 trilhas em 2 dias, 20 e 21 de Agosto, em sua 4a edição. Muito conteúdo, ótima organização, e uma galera bastante interessada no evento, em trocar idéias e fazer networking. Fiquei impressionado com o número de pessoas presentes no encerramento: um sábado, passando das 19 horas o auditório estava completamente lotado, impressionante!





Lá apresentei a palestra com as mudanças e novidades do Java 7 e junto com o Rafael Nunes a palestra sobre Arquiteturas JavaEE no Google App Engine, ambas na trilha Java. No domingo como congressista, assisti diversas palestras em várias trilhas. O Rafael Nunes foi o coordenador da trilha SOA/Cloud, em parceria com o Felipe Oliveira (SOAExpert).





Goiânia

Eu não conhecia Goiânia, adorei a cidade, muito bonita com um povo muito simpático. Falando sobre o evento, foi um sucesso, mais de 500 pessoas estiveram presentes nos dois dias do TDC2011 Goiânia, 29 e 30 de outubro. Foi a primeira edição do evento na região, que contou com 13 trilhas, e muita gente fera das comunidades presentes.

No mesmo espírito TDC, a galera estava 100% interessada no evento, rolando muita troca de informação e networking. Revi vários amigos, conheci uma galera muito gente boa e bastante prestativa. No primeiro dia, como congressista, assisti palestras nas trilhas: Empreendedorimo, Arduíno e Java.




No domingo fui o coordenador da trilha Mobile, e tenho muito a agradecer aos palestrantes dessa trilha que simplesmente arrebentaram, com palestras excelentes em diversos assuntos:
  • Como tirar proveito de uma plataforma Cloud (Google App Engine) em desenvolvimento Mobile, com o Rafael Nunes;
  • Soluções da Nokia para desenvolvimento mobile: Windows Phone e Symbia, com o Heitor Repolho;
  • As alternativas e o mercado de mobilidade, com Marcelo Quinta;
  • Os desafios no desenvolvimento de sites para mobile, com Marcelo Quinta e André Vilas Boas;
  • Uma visão completa de como funciona o programa de desenvolvedor iOS (iPhone, iPod, iPad), com Edson Luiz;
  • Reuso de código Android com as ferramentas BugSense e PushLink, com Célio Vasconcelos;

Destaque para a palestra do Rafael Costa, um GAROTO de 13 anos atualmente com 9 aplicativos publicados no Apple Store! O Rafa falou sobre desenvolvimento iOS com o framework GameKit, e impressionou a galera com seu conhecimento, desenvoltura e habilidade na apresentação da palestra. No fim da palestra ele interagiu com o público, respondendo com muita boa vontade todas as perguntas e curiosidades da galera.

Agradecimento mais do que especial para o Marcelo Quinta, grande profissional, gente finíssima, me ajudou muito na formação de conteúdo da trilha.

O Rafael Nunes, além de apresentar a palestra na trilha Mobile, foi o
coordenador da trilha SOA/Cloud, novamente em parceira com o Felipe Oliveira.



Outro destaque do TDC2011 Goiânia foram os happy’s e as baladinhas, rolou muita diversão, com direito até a uma canja do Saulo Arruda: o cara arrebentou, manda muito bem no violão!

O TDC já foi consolidado com um dos melhores e principais eventos sobre desenvolvimento de software do Brasil, seu formato inovou e agradou as diversas comunidades que apoiaram e seguiram proposta do evento. O TDC2011, no meu caso, foi uma oportunidade para:
  • Compartilhar um pouco do que eu conheço;
  • Aprender mais e renovar minhas inspirações;
  • Conhecer pessoas de diferentes estilos, com foco em conteúdo;
  • Conhecer lugares interessantes;
  • Muita diversão, com happy’s regados a muita cerveja e excelentes conversas;

Uma pena que TDC2011 acabou, mas já na expectativa pois logo logo chega a vez do TDC2012! Parabéns a Globalcode e a empresas que atuaram na organização das 3 edições do TDC2011, foi incrível.

@edermag
www.yaw.com.br

Friday, October 14, 2011

Oracle linguistic sort: desconsiderar letras minúsculas/maiúsculas e acentuação

A partir da versão 10g o Oracle passou a suportar a busca em String utilizando classificação linguística (linguistic sort). O que na prática permite a busca em um campo String desconsiderando diferenças, por exemplo, entre letras minúsculas e maiúsculas ou o uso de acentuação.

Os comandos a seguir habilitam, na sessão do usuário, a comparação por linguística e a classificação binária desconsiderando acentuação e case insensitive:

SQL>ALTER SESSION SET NLS_SORT='BINARY_AI';
SQL>ALTER SESSION SET NLS_COMP='LINGUISTIC';


SQL>CREATE TABLE teste (texto VARCHAR2(10));
SQL>INSERT INTO teste VALUES('Macaco');
SQL>INSERT INTO teste VALUES('maça');
SQL>INSERT INTO teste VALUES('maçarico');
SQL>INSERT INTO teste VALUES('MAÇONARIA');

SQL>select texto from teste where texto like 'mac%';

TEXTO
---------
Macaco
maça
maçarico
MAÇONARIA


O mesmo resultado é processado com a seguinte instrução:

select texto from teste where texto like 'MAÇ%';

Mesmo informando o acento, como no segundo comando, registros sem acentuação são Macaco sem acento é retornado.

O Oracle também suporta a busca ordena por um idioma:

SQL>SELECT texto FROM teste ORDER BY NLSSORT(texto, 'NLS_LANG = PT');


Outra funcionalidade, apresentar a descrição da data em um determinado idioma:

SQL>SELECT to_char(sysdate, 'DD/MON/YYYY', 'nls_date_language = French') from dual;

Link para a documentação online dessas funcionalidades.



Tuesday, August 23, 2011

Solução em Java 7 para a prova do Google Developer Day 2011

Semana passada me diverti um pouco com a prova para o Google Developer Day 2011. A prova não é obrigatória, na verdade faz parte do processo de inscrição e dever ser utilizada como filtro para identificar as pessoas que se adequema o público alvo do evento: Developers.

A prova era composta por 5 questões, todas em torno de 2 textos do idioma Googlon.


Regras do idioma

Letras e ordem do idioma: t w d c r z p s v h m k l n f x q j b g

Esse idioma estipula grupos de letras:
  - letras tipo foo: g, f, z, t e s
  - letras tipo bar: todas as outras.

As preposições são identificadas com a seguinte regra: palavras com 3 letras que terminam com uma letra do tipo bar, mas que não pode ser m.

A regra para identificar verbos: palavras de 7 ou mais letras que terminam com uma letra do tipo bar. Caso a palavra seja um verbo e começe com uma letra do tipo bar, deve ser considerado um verbo de primeira pessoa.

E os números? As palavras são números. Esses números são formados em base 20, onde cada letra é uma digito ordenado do menos para o mais significativo (contrário do binário). Dessa forma a primeira posição é 1, a segunda é 20, a terceira é 400 e assim por diante. Outro detalhe importante: cada letra tem um valor (posição) conforme a ordem do alfabeto, por exemplo t é 0, w é 1, d é 2, etc. Ainda para os números, existem uma classificação de números bonitos. Em Googlon um número bonito deve ser maior ou igual a 502344 e divisível por 4.


Questões

Todas as questões contavam com uma dica do Google, elas eram respondidas levando em consideração a o texto A, mas o participante deveria responder considerando o texto B.
  1. Qual a quantidade preposições no texto B?
  2. Quantos verbos existem no texto B?
  3. Quantos verbos em 1a pessoa existem no texto B?
  4. Imprimir o texto B colocando as palavras na ordem alfabética do Googlon.
  5. Quantos números bonitos existem no texto B?

A solução

Na semana passada estava focado em terminar demos e a apresentação que fiz no TDC2011 em Floripa, sobre Java 7. Aproveitei o embalo pra implementar a solução da prova do GDD usando Java, mas com um detalhe especial: primeiro programa utilizando Java 7. Coloquei as letras na ordem do Googlon em um List e fiz um split do texto (uma String). Dessa forma iteirei sob as palavras para encontrar as preposições, verbos (1a pessoa tb) e números, além de aplicar a ordenação Googlon.

import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
import java.util.TreeSet;

import static java.lang.System.out;

public class Googlon {

  static List<Character> alf_ordem = 
    Arrays.asList( new Character[] {'t','w','d','c','r','z','p','s','v','h',
      'm','k','l', 'n','f','x','q','j','b','g'} );

  public static void main(String[] args) {
    String textoB = "prm pmqcf flqk mblz fzrr ..."; //um pedaco do texto B

    int preposicoes = 0, verbos = 0, verbos1Pessoa = 0, numerosBonitos = 0;
    //determina as letras do tipo foo
    List<Character> foo = 
      Arrays.asList( new Character[]{'g','f','z','t','s'} );

    //treeset com comparator resolvendo a ordem as palavras (questao 3)
    TreeSet<String> listaEmOrdem = new TreeSet<>(new Comparator<String>(){
      @Override
      public int compare(String s1, String s2) {
        int len1 = s1.length(), len2 = s2.length();
        int lim = Math.min(len1, len2);
        char chars1[] = s1.toCharArray(), chars2[] = s2.toCharArray();

        int i = 0;
        while (i < lim) {
          char c1 = chars1[i];
          char c2 = chars2[i];
          if (c1 != c2) {
            return alf_ordem.indexOf(c1) - alf_ordem.indexOf(c2);
          }
          i++;
        }
        return len1 - len2;
      }
    });

    //aqui percorro todas palavras, para ordernar e validar
    for (String s: textoB.split(" ")) {
      listaEmOrdem.add(s);

      if (isNumeroBonito(converteParaNumero(s))) {
        numerosBonitos++;
      }

      if (s.length() == 3) {
        if (!foo.contains(s.charAt(s.length()-1)) && s.indexOf('m') == -1) {
          preposicoes++;
        }
        continue;
      }

      if (s.length() >= 7) {
        if (!foo.contains(s.charAt(s.length()-1))) {
          verbos++;
          if (!foo.contains(s.charAt(0))) {
            verbos1Pessoa++;
          }
        }
      }
    }

    StringBuilder textoOrdenadoTeste = new StringBuilder();
    for (String s: listaEmOrdem) {
      textoOrdenadoTeste.append(s).append(" ");
    }

    out.println("1a resposta, qtde de preposicoes: "+preposicoes);
    out.println("2a resposta, qtde de verbos: "+verbos);
    out.println("3a resposta, qtde de verbos 1a pessoa: "+verbos1Pessoa);
    out.println("4a resposta, o texto ordenado: "+ textoOrdenadoTeste);
    out.println("5a resposta, qtde de numeros bonitos? "+numerosBonitos);
  }

  private static long converteParaNumero(String palavra) {
    int n = 0;
    long total = 0;
    for (char c: palavra.toCharArray()) {
      int codigo = alf_ordem.indexOf(c);
      total += codigo * (long) Math.pow(20,n++);
    }
    return total;
  }

  private static boolean isNumeroBonito(long numero) {
    //literal int com separador _ e a literal 4 em binario
    return numero >= 502_344 && numero % 0b100 == 0;
  }
}

Para rodar essa classe em versões anteriores do Java é muito simples, na ordem:
  • defina a tipagem de String na instância do objeto TreeSet no lugar do operador diamond.
  • dentro do método isNumeroBonito, na linha 92, remova o "_" entre o número 502304 e utiliza 4 em decimal ao invés de binário (0b100).

@edermag
www.yaw.com.br