Posts de March, 2009

[Rafael Biriba] FFmpeg: Conversão de mp4 para wmv

Monday, March 16th, 2009
FFmpeg: http://www.ffmpeg.org/

FFmpeg: http://www.ffmpeg.org/

Mês passado, tive que fazer uma conversão deste tipo. Eu possuia um vídeo em mp4 e precisava converter para wmv, para que o mesmo fosse executado no windows utilizando o codec nativo, sem utilizar nenhum codec adicional para isso.

O Arquivo .MP4:
Stream #0.0(und): Video: h264, yuv420p, 480×360 [PAR 0:1 DAR 0:1], 29.97 tb(r)
Stream #0.1(und): Audio: mpeg4aac, 44100 Hz, stereo

Ao final de alguns testes, consegui converter para o seguinte arquivo .wmv:
Stream #0.0: Video: wmv1, yuv420p, 480×360 [PAR 0:1 DAR 0:1], 29.92 tb(r)
Stream #0.1: Audio: wmav2, 44100 Hz, stereo, 64 kb/s

Abaixo segue a linha de comando:
ffmpeg -i video_entrada.mp4 -vcodec wmv1 -acodec wmav2 -deinterlace -sameq video_saida.wmv

Utilizei o codec de vídeo WMV1 e o codec de áudio WMVA2, seguidos pelo deinterlace ( desentrelaçamento do vídeo ) e o sameq ( mesma qualidade de vídeo do original ).

——————————————————-
Instalação do FFmpeg:
FFmpeg: Solução ideal para Áudio e Vídeo

——————————————————

Procedimento de Uso:

ubuntu

Usuários Linux tem sempre mais facilidade, nesse tipo de procedimento.

Basta abrir o Terminal e digitar:

ffmpeg -i video_entrada.mp4 -vcodec wmv1 -acodec wmav2 -deinterlace -sameq video_saida.wmv

Onde meu arquivo se chama video_entrada.mp4 e se encontra na área de trabalho.
( Levando em consideração que ao abrir o terminal você vai estar dentro da pasta home do usuário local )

————————————————————————————————————

logo_windowsUsuários Windows levam mais tempo para poder executar o comando.
Entre em INICIAR > EXECUTAR e digite cmd > OK ( Para abrir o Terminal do Windows )
Acesse a pasta digitando:
cd Desktop/pasta_do_ffmpeg/
em seguida:
ffmpeg.exe -i “../video_entrada.mp4″ -vcodec wmv1 -acodec wmav2 -deinterlace -sameq “../video_saida.wmv”

Onde meu arquivo se chama video_entrada.mp4 e se encontra na área de trabalho.
( Utilizamos ../ para sair da pasta do ffmpeg e acessar o filme.avi a partir da área de trabalho. )

————————————————————————————————————
Leitura recomendada:
Windows VS FFmpeg e Mplayer
————————————————————————————————————

[Tiago Motta] Nomes de métodos e variáveis devem ser no idioma do cliente

Monday, March 16th, 2009

Recentemente Carlos Brando escreveu um excelente artigo em seu blog sobre nomes de métodos e variáveis. Dentre as diversas dicas, uma eu não concordei, comentei lá sobre isso, e o argumento de resposta não me foi convincente.

O ponto de discordância dizia respeito a necessidade de evitar código bilingue. Segundo ele, já que a maioria das linguagens de programação são em inglês, nada mais correto do que escrever o nome das classes e metódos também em inglês. Para começar vou contar uma pequena historinha:

Experiência própria: Laboratório geológico

Há um bom tempo atrás trabalhei em uma empresa que desenvolvia um sistema para um laboratório geológico. Um dia, um dos desenvolvedores do time ligou para tirar duvidas com o cliente e fez a seguinte pergunta “Quando um sample alcança um result no segundo stage em determinado job, ele pode parar os próximos stages ou deve seguir até a conclusão de todos”.

O rapaz na outra ponta ficou completamente confuso. Era novo no laboratório, conhecia toda cadeia de análises de amostras mas não conhecia os estranhos termos que a equipe de desenvolvimento vira e mexe falava. Sample, result e stage não eram palavras de domínio do laboratório, e sim os seus similares em português. Mas como o sistema estava sendo desenvolvido com os termos em inglês, constantemente os membros do time de desenvolvimento, eu incluso, os citava, atrapalhando a comunicação e o entendimento dos problemas.

Eis então a pergunta: Será que um código que mistura termos em inglês e português causa mais problemas que os ruídos na comunicação com o cliente? Pode-se alegar que o código nem será mostrado ao usuário, mas na hora em que o desenvolvedor precisa se comunicar com o cliente, na mente dele ele não está trabalhando com amostras, ele está trabalhando com samples.

Mas o mais interessante é que dentre o domínio do laboratório geológico, um item era em inglês, o Job. Eles falavam amostras, estágio, resultados, mas falavam Job. Isso então nos leva a uma conclusão.

O idioma como ferramenta

A grande questão é que o idioma é apenas uma ferramenta para a comunicação. O primeiro item do manifesto ágil fala “Indivíduos e interação entre eles mais que processos e ferramentas”. No caso, acredito que a interação entre os individuos, no caso a comunicação, é mais importante do que a ferramenta, que no caso é o idioma. Portanto eu prefiro priorizar a comunicação independente do idioma. Se meu cliente possuir termos em seu negócio em francês e outros em alemão, eu prefiro utilizá-los no meu sistema para que ao conversar com ele eu não me confunda com os termos usados na programação.

Um contra-argumento muito usado é dizer que utilizar termos em português em uma linguagem de programação em inglês torna o código sujo. Mas será que isso é realmente verdade?

Código limpo depende do idioma?

Antes de discutir é preciso definir o que é um código limpo. Em minha concepção código limpo é aquele fácil de entender. As técnicas apresentadas pelo Carlos Brando são realmente importantes. Mas será que o seguinte código é complicado de entender?

amostras = Amostra.obter_amostras_com_resultado_positivoamostras.each do |amostra|  puts amostra.produto.siglaend

Será que o fato de utilizarmos inglês misturado com o português tornou mais dificil o seu entendimento? Eu não só creio que não, como acredito que por conta das expressões utilizadas pelo cliente serem idênticas ao do programa, o entendimento fica mais fácil ainda.

Dizer o contrário é o mesmo que defender o uso de arcabouço e chamada de retorno ao invés de framework e callback, em trabalhos acadêmicos somente por uma questão de purismo idiomático. É nesse público que políticos como o deputado Aldo Rebelo se mira, tentando aprovar projetos de lei perigosos.

Mas e o mercado internacional?

Outro ponto levantado para defender o uso de termos diferentes dos do domínio do cliente é a possibilidade de venda do software ao exterior em algum remoto dia. Ao meu entender isso é um pouco de síndrome do mapa de calor. Um problema comum em empresas de desenvolvimento que não seguem o manifesto ágil. Este tipo de argumento futurista era muito utilizado para defender que aplicações fossem escritas em Java. Coisas do tipo “E se um dia quisermos colocar esse software numa geladeira”.

O interessante é que na resposta que recebi, foi citado que para não haver confusão nas conversas com o cliente poderíamos fazer as especificações em português. Mas oras, quando um software é vendido, as especificações vão juntas. Se for vendido para o exterior teríamos o mesmo problema. E pior ainda, as especificações, que dizem exatamente o que o sistema faz estariam em uma lingua diferente da do cliente.

O fato é que a possibilidade de se vender um sistema ao exterior em algum futuro remoto não deve se tornar um empecilho na comunicação com o cliente local, que é quem vai gerar receita mais brevemente. Se um dia realmente a venda for uma possibilidade real faz-se um refactory.

Só para constar, a desculpa para desenvolver o sistema exemplificado no ínicio do post em inglês foi exatamente esta. Hoje, 6 anos depois o foco da empresa mudou totalmente, nenhum outro sistema de laboratório foi vendido ou criado. Somente este continua em manutenção. Dos outros que desenvolvi em Java nenhum precisou trocar de sistema operacional ou mesmo ser instalado em geladeiras.

Enfim a conclusão

O que defendo não é programar em um idioma e não em outro. Defendo que deve-se programar o mais próximo da realidade. Se o seu cliente tiver todos os termos do seu negócio em inglês, ótimo, programe em inglês. Fora isso, vejo apenas dois outros motivos para basear sua programação no idioma britânico: O software que você está desenvolvendo é uma biblioteca ou framework open-source; Ou a maioria dos membros da sua equipe só fala inglês.

[Tiago Peczenyj] 10 coisas que todo o programador deveria saber

Sunday, March 15th, 2009

Listas de x coisas só servem para lembrar de tudo o que ficou de fora, portanto, IMHO, as 10 coisas que todo o programador deveria saber são:

0 - usar o google
1 - fazer um hello world em pelo menos 5 linguagens de programação diferentes (sendo uma funcional e uma script)
2 - instalar o wordpress e tudo o que é necessario para que o mesmo execute.
3 - instalar e configurar o Ubuntu, ou outro *nix, incluindo configuração de rede e impressão
4 - entender o que é CLASSPATH
5 - saber a diferença entre HTTP e FTP, entre TCP e UDP e qual camada OSI eles atuam. bonus: saber como funciona um GET ou POST (é possivel ver usando o live http headers do firefox).
6 - conhecer o comando grep e algumas opções como -c, -v, -A
7 - SQL: entender o que é select,update,insert, delete, commit, rollback
8 - como ler e gerar XML
9 - entender o que é NULL, , **qqcoisa do C e quais os seus usos (principalmente em strings)
10 - a diferença entre licença BSD e GPL veja aqui.

Alem disso é bom seguir alguns blogs, frequentar foruns, listas de discussão e ler muito. Mesmo um texto “chato” como A Catedral e o Bazar traz informações relevantes e outras referencias.

Boa sorte e que começe a flame-war :)

[Tiago Peczenyj] JMock - trabalhando com mock objets em java

Sunday, March 15th, 2009

Lendo sobre testes unitarios, imagine o caso onde o seu teste é complexo: um objeto que chama outro e, então, realiza as suas tarefas. Um bom caso é um DAO que acessa o banco de dados para fazer alguma coisa: se vc pensa em testar esse codigo de forma unitaria teria que subir um banco de testes e, se encontrasse um problema, poderia ser dificil dizer se é problema do DAO ou dos objetos que ele depende (como a conexão com o banco, ou o banco em si).

A solução para estes casos pode ser trabalhar com mocks: objetos “burros” que podem não ter nenhuma função alem de responder ao que vc especificou. A abordagem mais utilizada é vc programar estes objetos para responder a um ou mais metodos com argumentos especificos, assim como as respostas esperadas. No caso do DAO eu posso esperar um determinado SQL e especificar uma determinada resposta, tudo de acordo com o meu cenario de teste.

É claro que Mock Objects em excesso podem atrapalhar, mas é tudo uma questão de bom senso: costumo dizer para quem esta começando a focar os testes nas partes mais importantes do sistema, o core do modelo e regras de negocio e, então, incrementar estas praticas caso veja necessidade. Sem falar que volta e meia surge algo novo.

Para java existe o excelente framework JMock. Logo de cara o site oficial traz um exemplo de como utilizar um mock bem simples (incluindo a integração do mesmo com JUnit 4)

http://www.jmock.org/getting-started.html

Para entender, imagine esta interface

interface Subscriber {
void receive(String message);
}

Imagine que eu tenho um objeto do tipo Publisher que, ao invocar o metodo publish(message), ele envie esta mensagem para um Subscriber (que recebe com o metodo acima). Para testar o publish eu teria que me certificar que o metodo receive deste objeto Subscriber foi invocado com a mensagem especificada, mais ou menos assim:

import org.jmock.integration.junit4.JMock;
import org.jmock.integration.junit4.JUnit4Mockery;
import org.jmock.Expectations;

@RunWith(JMock.class)
class PublisherTest {
Mockery context = new JUnit4Mockery();

@Test
public void oneSubscriberReceivesAMessage() {
// set up
final Subscriber subscriber = context.mock(Subscriber.class);

Publisher publisher = new Publisher(); // objeto que vou testar
publisher.add(subscriber); // tenho que adicionar o mock!

final String message = “message”;

// aqui eu programo o que eu espero do teste
context.checking(new Expectations() {{
oneOf (subscriber).receive(message);
}});

// aqui eu executo!
publisher.publish(message);
}
}

Facil?

[Tiago Peczenyj] XStream - Simplicidade ao lidar com XML em Java

Sunday, March 15th, 2009

Quem nunca passou por isso: ter que gerar e/ou ler arquivos xml e teve que escolher dentre diversas tecnologias e frameworks diferentes. Seja carregar tudo pra memoria ou ler aos poucos, se é um parser push ou pull, etc, é possivel dizer que para cada situação existe uma boa escolha.

Se o seu caso é trabalhar com arquivos cujos elementos podem ser mapeados em objetos java, uma boa escolha é o XStream

XStream xstream = new XStream(new DomDriver());
Person pac = new Person(”Tiago”, “Pac Man”);
String xml = xstream.toXML(pac);

/* Simples. É, para fazer o contrario, basta */

Person newPac = (Person)xstream.fromXML(xml);

Este e outros exemplos podem ser conferidos aqui:
http://xstream.codehaus.org/tutorial.html

É claro que o xml gerado assim, cru, nem sempre serve. Para isso vamos usar algumas linhas a mais para trabalhar com os recursos de alias, annotations e os Converters.


xtream.alias(”pessoa”,Person.class);

Dessa forma, para se livrar do nome.do.pacode.Person e trabalhar com algo mais expressivo como pessoa, basta adicionar este alias antes de converter de/para xml. Para trabalhar com aliasing de atributos (e coleções implicitas) o ponto de partida é este:

http://xstream.codehaus.org/alias-tutorial.html

É possivel trabalhar com annotations no seu modelo de classes, evitando toda essa configuração manual

http://xstream.codehaus.org/annotations-tutorial.html

Para trabalhar com o maximo de flexibilidade do XStream, entretanto, vc precisa trabalhar com Converters - Veja o exemplo da classe Birthday

http://xstream.codehaus.org/converter-tutorial.html

XStream trabalha muito bem com classes imutaveis, pois não recria os objetos usando o construtor e sim de maneira semelhante ao mecanismo de serialização de objetos, fazendo um bypass do construtor. Sem falar que traz um pensamento menos voltado a “tags” e mais OO.

[Rodolfo Carvalho] Escreva menos, use Python

Saturday, March 14th, 2009

Ontem vivenciei uma situação em que tivemos que manter um código legado para inserir mais uma pequena funcionalidade.
Uma “regra” aqui é não se desviar do que você tem que fazer (que possui mais valor de negócio) para cuidar de outras coisas. Outra “regra” é não deixar débito técnico.
A grande dificuldade é encontrar o balanço adequado entre esses dois objetivos, e ainda assim implementar sua nova funcionalidade.

Bem, livre de qualquer “regra”, vou aproveitar esse post para introduzir 3 recursos do Python que nem sempre são lembrados, e que nos permitem economizar linhas de código, escrevendo de forma clara e concisa o que queremos fazer.

  1. Método get dos dicionários;
  2. Método split das strings;
  3. Função builtin/global setattr.

Vamos partir do seguinte código legado:

#...
from django.shortcuts import render_to_response
from model import Cadastro
#...

def tratar_cadastro(request):
   post = request.POST
   #...
   cadastro = Cadastro()
   #...

   if post.has_key('nome'):
       cadastro.nome = post['nome']

   if post.has_key('endereco'):
       cadastro.endereco = post['endereco']

   if post.has_key('telefone'):
       cadastro.telefone = post['telefone']

   if post.has_key('email'):
       cadastro.email = post['email']

   return render_to_response('cadastro/index.html', {"cadastro": cadastro})

É um esboço de uma View do Django. Como podem ver, espera-se que a view seja requisitada via HTTP POST, com a passagem de diversos parâmetros, que ficam armazenados no dicionário Python request.POST. Esse papo de cadastro, nome, telefone, etc é só para ilustrar.
Então o código que temos é uma sequência de if’s que setam atributos de uma instância de Cadastro que é posteriormente passada para o template.

Podemos imaginar que temos um formulário numa página que, ao ser submetido, exibe as informações preenchidas para confirmação.

Agora temos que adicionar mais um campo ao cadastro. Digamos que nosso cliente pediu para guardar também o campo “idade”. Por simetria, acabaria acontecendo o seguinte:

#...
from django.shortcuts import render_to_response
from model import Cadastro
#...

def tratar_cadastro(request):
    post = request.POST
    #...
    cadastro = Cadastro()
    #...

    if post.has_key('nome'):
        cadastro.nome = post['nome']

    if post.has_key('idade'):
        cadastro.idade = post['idade']

    if post.has_key('endereco'):
        cadastro.endereco = post['endereco']

    if post.has_key('telefone'):
        cadastro.telefone = post['telefone']

    if post.has_key('email'):
        cadastro.email = post['email']

    return render_to_response('cadastro/index.html', {"cadastro": cadastro})

Pra que mudar o que já funciona? Bem, vamos então ao primeiro dos tópicos.
Usar o dict.has_key é ruim e desnecessário. Esse método é deprecated no Python 2.6 e já foi removido da linguagem no Python 3.0, em favor da forma chave in dicionario. No lugar dele e do if deveríamos usar o dict.get.
Mas o que esse método faz? Ele retorna o valor de dict['key'] se o dicionário tem a chave ‘key’, senão retorna None ou outro valor padrão que o programador especificar.
Ficaria assim:

#...
from django.shortcuts import render_to_response
from model import Cadastro
#...

def tratar_cadastro(request):
    post = request.POST
    #...
    cadastro = Cadastro()
    #...

    if post.has_key('nome'):
        cadastro.nome = post['nome']

    cadastro.idade = post.get('idade', u'Campo não preenchido')

    if post.has_key('endereco'):
        cadastro.endereco = post['endereco']

    if post.has_key('telefone'):
        cadastro.telefone = post['telefone']

    if post.has_key('email'):
        cadastro.email = post['email']

    return render_to_response('cadastro/index.html', {"cadastro": cadastro})

Além de economizar linhas, temos um código menos redundante e seguindo o princípio de “It’s better to beg forgiveness than to ask permission”.
Vamos refatorar o resto do código:

#...
from django.shortcuts import render_to_response
from model import Cadastro
#...

def tratar_cadastro(request):
    post = request.POST
    #...
    cadastro = Cadastro()
    #...

    cadastro.nome = post.get('nome')
    cadastro.idade = post.get('idade')
    cadastro.endereco = post.get('endereco')
    cadastro.telefone = post.get('telefone')
    cadastro.email = post.get('email')

    return render_to_response('cadastro/index.html', {"cadastro": cadastro})

Assim, caso um dos campos não venha no POST, será atribuído o valor None ao atributo do objeto cadastro.
Notem que, assim como antes, existe bastante duplicação de código (por razões práticas, fiz um exemplo com poucas chaves do dicionário, mas o caso que me deparei eram mais que dez…).
Agora então é a hora de introduzir os outros dois conceitos, o split e o setattr.
O primeiro transforma uma string em lista através de um separador. Exemplo:

>>>  print "um, dois, tres".split(", ")
['um', 'dois', 'tres']

Isso pode ser usado para declararmos uma lista sem precisar de muitas aspas e vírgulas… basta colocar todos os itens da lista em uma string e usar o split.
O outro faz o mesmo que objeto.atributo = valor, porém atributo pode ser algo dinâmico, definido em tempo de execução.
Com essas mudanças, nosso código ganha uma tremenda compressão, sem perder legibilidade:

#...
from django.shortcuts import render_to_response
from model import Cadastro
#...

def tratar_cadastro(request):
    post = request.POST
    #...
    cadastro = Cadastro()
    #...

    for attr in 'nome idade endereco telefone email'.split():
        setattr(cadastro, attr, post.get(attr))

    return render_to_response('cadastro/index.html', {"cadastro": cadastro})

[Rafael Biriba] QR Code: Faça a leitura pelo seu celular

Saturday, March 14th, 2009
QR Code com a URL deste BLOG

QR Code com a URL deste BLOG

*Para quem ainda não conhece a tecnologia QR Code, recomendo a leitura do POST:
http://www.rafaelbiriba.com/2009/03/12/qr-code-codigo-de-barras-do-presente.html

Para fazer a leitura do QR Code pelo seu celular, deve ser baixado uma aplicação em Java. Abaixo sgue os links dos sites que possuem as aplicações, e que funcionam, pois foram testadas por mim.

Kaywa Reader

http://reader.kaywa.com/

Aperte em “Clique aqui para baixar o Kaywa Reader”
Em seguida escolha a forma que deseja fazer o download.

O ideal é baixar direto do seu celular, mas eu testei a opção: Do computador para o seu celular.
Ele pede pra selecionar marca e modelo, em seguinda, é necessário fazer o cadastro no site.

Após isso, basta transferir os arquivos Java para o seu celular, instalar e sair por aí lendo os QR Codes.

Neo Reader

http://www.neoreader.com/download.html

No site do Neo Reader, só é possível baixar a aplicação, se for direto pelo celular.
O Download pode ser feito pela URL: get.neoreader.com

O Download direto pelo celular, é uma opção adequada, pois o site já reconhece a marca e modelo, e já disponibiliza para download a versão do software compatível com o aparelho !

Em breve, explicarei como gerar seus QR Codes e como fazer a leitura deles pelo PC.

[Rafael Biriba] QR Code: Faça a leitura pelo seu celular

Saturday, March 14th, 2009
QR Code com a URL deste BLOG

QR Code com a URL deste BLOG

*Para quem ainda não conhece a tecnologia QR Code, recomendo a leitura do POST:
http://www.rafaelbiriba.com/2009/03/12/qr-code-codigo-de-barras-do-presente.html

Para fazer a leitura do QR Code pelo seu celular, deve ser baixado uma aplicação em Java. Abaixo sgue os links dos sites que possuem as aplicações, e que funcionam, pois foram testadas por mim.

Kaywa Reader

http://reader.kaywa.com/

Aperte em “Clique aqui para baixar o Kaywa Reader”
Em seguida escolha a forma que deseja fazer o download.

O ideal é baixar direto do seu celular, mas eu testei a opção: Do computador para o seu celular.
Ele pede pra selecionar marca e modelo, em seguinda, é necessário fazer o cadastro no site.

Após isso, basta transferir os arquivos Java para o seu celular, instalar e sair por aí lendo os QR Codes.

Neo Reader

http://www.neoreader.com/download.html

No site do Neo Reader, só é possível baixar a aplicação, se for direto pelo celular.
O Download pode ser feito pela URL: get.neoreader.com

O Download direto pelo celular, é uma opção adequada, pois o site já reconhece a marca e modelo, e já disponibiliza para download a versão do software compatível com o aparelho !

Em breve, explicarei como gerar seus QR Codes e como fazer a leitura deles pelo PC.

[Tiago Motta] Alias e functions para seu dia-a-dia com git

Thursday, March 12th, 2009

Embora o Git seja uma poderosa ferramenta de controle de versão, a quantidade de passos que é necessário para executar alguns procedimentos básicos pode dificultar um pouco o dia-a-dia do desenvolvedor. Principalmente se o projeto em questão não requer todas as funcionalidades que o git oferece para compartilhar código entre grandes equipes espalhadas.

Felizmente é possível criar alguns alias e functions para facilitar o seu uso. Dessa forma podemos utilizar o git de maneira mais simples, e quando houver a necessidade de usar um dos seus recursos avançados, basta não usar esses atalhos. Segue abaixo os que tenho utilizado:

gitshazam

Adiciona todos os arquivos criados, modificados, deletados e depois comita para o repositório local com a mensagem informada.

alias gitshazam='git add -u && git add . && git commit -m'

Exemplo de uso:

gitshazam 'Minha mensagem de commit'git push

gitcoleradodragao

Sincroniza com o repositório remoto as informações dos branchs existentes e os exibe, mostrando também em que branch você está desenvolvendo atualmente.

alias gitcoleradodragao='git fetch && git branch -a -v'

gitpodediamante

Cria um branch local com o nome informado e o associa ao branch de mesmo nome no repositório remoto.

function gitpodediamante() { git checkout --track -b $1 origin/$1; }

Exemplo de uso:

gitpodediamante 'historia-22'

Agradecimentos especiais à galera da minha equipe que tem me ajudado bastante com o git e aguentado minhas reclamações.

[Rafael Biriba] QR Code: Código de barras do presente

Thursday, March 12th, 2009
QR Code com a URL deste BLOG

QR Code com a URL deste BLOG

O QR Code é uma matriz ou um código de barras bi-dimencional, cujo código pode ser interpretado rapidamente. É bastante utilizado no Japão. Através um programa de computador, ou até mesmo um aplicativo para celular, é possível de decifrar o codigo QR,  até mesmo uma camera VGA de baixa resolução para capturar a imagem.

No Brasil, o primeiro anúncio publicitário a utilizar o código QR foi publicado pela Fast Shop em dezembro de 2007. Mais tarde a Nova Schin publicou um anúncio com o código em junho de 2008 e a Claro fez uma campanha utilizando o Código QR em novembro de 2008.

Bastante utilizado no ramo publicitário, principalmente pela curiosidade que a imagem propõe, a tecnologia está cada vez mais presente no mercado.

Capacidade de Armazenamento:

  • Numérica - Max. 7.089 caracteres
  • Alfanumerica - Max. 4.296 caracteres
  • Binário (8 bits) - Max. 2.953 bytes

A facilidade  na distribuição de informação é incrível, pois ao invés de digitar a informação, basta apenas tirar uma foto da imagem do código e através de um software é possível extrair os dados.

batata_com_qr-code

Conforme no exemplo, mercados de todo o japão já integraram o QR Code, em seus produtos. Diferente do código de barras tradicional, a leitura é mais rápida e é possível passar mais informações, como preço, data de validade e lote, por exemplo.

burger-qr-code

No cheeseburguer, o QR Code carrega informações como nome da loja, endereço, telefone, site e outras possíveis informações.

Muito em breve teremos vários anúncios publicitários no Brasil, utilizando o QR Code, para as mais variadas utilidades. A Tecnologia também nos permite carregar nossas informações ”impressas’, ou seja podemos gerar um código com uma informação qualquer, e depois imprimi-lo. Para recuperar a informação, basta utilizar um scanner ou somente fotografar a imagem, e através de um software específico extrair os dados novamente.

Não somente no ramo publicitário, programas de televisão já estão implementando o código. O que diz esta matéria no site do O Globo Tecnologia, onde durante a exibição do Multi Show, um QR Code seria mostrado e quando lido pelo celular direciona o usuário para um conteúdo adicional (texto, fotos, vídeos ou sites ).

qrcode-cracha

Devido o seu desempenho, o QR Code também está sendo utilizado nos Crachás das empresas. Carregando todas as informações necessárias, qualquer computador ou roleta habilitada, pode capturar e salvar os dados do QR Code.

Nos próximos POSTs explicarei como gerar um QR Code, e logicamente fazer a leitura.

=)