Representações binárias de inteiros negativos

Este é um guia rápido para aprender como funciona a representação de inteiros negativos em computadores. Independentemente da convenção, inteiros positivos sempre têm a mesma representação. O que muda entre as convenções é a representação dos negativos.

Neste post listarei três tipos de representações. Em todas elas, utiliza-se o bit mais significativo (Most Significant Bit - MSB) para determinar o sinal. Se for 1, é negativo, se for 0, é positivo.

Sinal e Magnitude

Esta é simples. Para transformar um número positivo num negativo, basta trocar o sinal, através do MSB. Ou seja, se 00000010 é +2, 10000010 é -2.

O problema desta representação é que ela não é eficiente na hora de realizar cálculos aritméticos. Então antes de enviar um número negativo para a unidade aritmética, os processadores que utilizavam essa representação convertiam para outra representação (complemento a um, por exemplo), e quando liam o resultado, convertiam de volta para o "Sinal e Magnitude" antes de gravar no registrador.

Outro problema é a dupla representação do zero. Há o zero 0000000 e o zero negativo 10000000. Graças a isto, a operação de comparação com zero seria formada por duas operações na prática.

Num inteiro sem sinal, oito bits podem representar 256 valores (0 a 255). Já num inteiro com sinal, utilizando a representação Sinal e Magnitude, perderíamos 1 bit para o sinal e teríamos 7 bits para a magnitude. Ou seja, 0 a 127 com MSB 0 (0 a +127), e 0 a 127 com MSB 1 (-0 a -127). Continuamos com 256 valores, mas dois representam a mesma coisa (0 e -0), então na prática, podemos representar apenas 255 valores, quando estamos trabalhando com inteiros com sinal, usando Sinal e Magnitude.

Complemento a Um

Na representação Complemento a Um, em vez de trocar apenas o MSB, precisamos também inverter todos os outros bits, se o número for negativo.

Repetindo o exemplo do 2 em um inteiro de 8 bits, aqui estão os seus valores utilizando Complemento a Um:
+2: 00000010
-2: 11111101

Perceba que agora podemos utilizar estes valores para realizar cálculos aritméticos e obtermos resultados válidos, diferentemente da representação com Sinal e Magnitude.

Se somarmos -2 com 2, obteremos 11111111, que significa -0. Ou seja, assim como a representação anterior, Complemento a Um também possui duas representações para o zero (00000000 e 11111111). E  para corrigir este problema, "inventaram" a representação Complemento a Dois, explicada a seguir.

Complemento a Dois

Esta representação é semelhante a Complemento a Um, com a diferença que possui mais um passo para tornar um número positivo em negativo.

Além de setar o MSB como 1 e inverter o restante dos dígitos, somamos 1 a este valor.

Ou seja, o passo-a-passo para transformar o dois positivo em dois negativo é:

Valor inicial: 00000010 (Dois positivo)
  1. Trocar MSB: 10000010
  2. Inverter bits após MSB: 11111101
  3. Somar um: 11111110
Nesta representação, as operações aritméticas também são preservadas, assim como no Complemento a Um. Se somarmos -2 com +2, obtemos:

+2: 00000010
-2: 11111110
-------------
   100000000

Resultado:
    00000000

Como você percebeu, o resultado verdadeiro precisaria de nove bits. Como isto ultrapassa o espaço que tínhamos para representar o inteiro, ele zera, assim como um hodômetro quando ultrapassa seu limite. Ele começa a contar do zero novamente. Isto é conhecido como overflow de inteiro, e apesar de parecer uma limitação, é usado a todo momento para realizar subtração de inteiros.

Na tabela abaixo, fazemos uma comparação da representação dos inteiros negativos, considerando uma máquina hipotética que utiliza 5 bits para guardar um inteiro:


Assimetria do Complemento a Dois

Preste atenção na diferença entre o Complemento a Um e Complemento a Dois na tabela. Veja que é como se fosse a mesma coluna, só que a da direita (Compl. a Dois) está deslocada uma linha para cima. Há dois efeitos para este deslocamento, um é a eliminação da dupla representação do zero, e outro ainda não havia sido mencionado, que é a assimetria de valores possíveis para o Complemento a Dois.

Pela tabela acima, a representação de Complemento a Dois parece desperdiçar o valor binário 10000. Ele está presente na coluna do Complemento a Um, mas não na do Complemento a Dois.

Isto acontece apenas na tabela. Na realidade, o Complemento a Dois não desperdiça nenhum valor binário. O 10000 no exemplo hipotético de inteiros de 5 bits corresponderia ao valor -16, que não seria possível de representar nem com o Sinal e Magnitude, nem com o Complemento a Um.

Ou seja, com 5 bits utilizando Complemento a Dois, poderíamos representar de -16 a -1 (10000 a 11111) e de 0 a 15 (00000 a 01111), totalizando 32 valores. Nas outras representações, só são representados 31 valores, já que temos dois reservados para o zero.

Scripts para gerar base de dados sobre os ônibus do Recife

Durante as férias, tive a ideia de fazer um site que ajudasse as pessoas a escolher que ônibus pegar para ir de um ponto a outro da cidade.

Minha inspiração foi no extinto www.onibusrecife.com.br desenvolvido pela Inove Informática. Era um site muito útil, diria até essencial, mas por problemas técnicos (?) foi tirado do ar. Inicialmente, iria utilizar minha aplicação no meu próprio computador, para fins pessoais mesmo, e se desse certo, disponibilizaria no estilo SaaS. Seria muito mais simples que o onibusrecife, mas com o mínimo de funcionalidade que faltava no site da Grande Recife, que possuía todos os dados, mas não fornecia um serviço deste tipo.

O primeiro passo foi extrair os dados dos itinerários de cada linha, contidos na página da Grande Recife. Lá não há nenhuma API ou facilidade que permita conseguir estas informações, então o jeito foi baixar todas as páginas HTML e fazer uma série de filtros com expressões regulares, para extrair apenas o desejado.

Além dos scripts de download e extração de dados, também fiz os que transformam os dados em queries SQL. Assim, no final do processo, você tem seu BD pronto com os dados que precisa.

Já que tudo foi colocado em scripts Bash, é possível automatizar todo o processo. Não sei como está hoje a formatação das páginas do Grande Recife. Provavelmente não mudaram nada de dois meses para cá. De qualquer forma, faz dois meses que parei esse projeto e decidi disponibilizar todos os scripts. Espero que seja útil para alguém.


Eu sei que falta algum README para explicar melhor como usar os scripts, mas por enquanto não fiz. Seria interessante algum conhecimento em expressões regulares e programas de filtros de texto padrão de sistemas GNU/Linux, como o sedsortgrep join. Dessa forma, você será capaz de corrigir erros que possam surgir.

Ah, esses códigos não têm nenhum tipo de licença. Pode usar como bem entender.
Atualização em 08 de Dezembro de 2012:
Na verdade, quando não está definido explicitamente qual a licença de um código fonte ou software, o default é que ele é proprietário. Ou seja, eu teria os direitos exclusivos de autor relacionados a cópias e redistribuição. O ideal é que eu colocasse junto ao código uma declaração de alguma licença de software livre, como a LGPL da FSF, só que ainda acho a LGPL não tão livre assim. Mas esse assunto pode ficar para outro post.

Laogai: O sistema prisional escravista da China



As prisões da China possuem dois nomes. Um referente à prisão em si e outro referente à empresa que funciona nela. Hoje em dia existem cerca de mil, totalizando de 3 a 5 milhões de detentos (ou quase 7 milhões de acordo com outras fontes). Estas prisões produzem produtos para construção, indústria, alimentos, químicos, brinquedos, vestuário, e são conhecidas coletivamente como Laogai, uma abreviação de Láodòng Gǎizào (勞動改造/劳动改造) que significa "reforma através do trabalho", o slogan do sistema de justiça criminal chinês. Muitos desses produtos são exportados e chegam aqui no Brasil, na indústria e nas nossas casas, sem nos importarmos com a sua origem.

Na série "Slavery: A 21st Century Evil", produzida pela TV Al Jazeera, o episódio "Prison Slaves" fala sobre este sistema com ajuda do Harry Wu, que foi preso em 1960 por ser um contrarrevolucionário que criticava a União Soviética, então aliada da China. Harry Wu passou 19 anos preso, trabalhando forçadamente no Laogai e fundou a Laogai Research Foundation, dedicando sua vida para chamar atenção aos abusos do governo chinês contra os direitos humanos.



Além de dissidentes políticos, também são presos muitos dissidentes religiosos no Laogai. Cristãos na China só podem praticar sua religião em igrejas registradas pelo estado. No entanto, muitos se recusam e praticam em igrejas não licenciadas e acabam sendo mandados para o Laogai.



No documentário, é entrevistada Abighail, uma jovem residente em Los Angeles, E.U.A. e ex-detenta do Laojiao ("Reeducação através do trabalho"). O Laojiao é um sistema parecido com o Laogai, também com trabalho forçado, mas para pessoas que cometeram delitos mais leves.

Abighail foi detida, sem nunca ter ido a julgamento, acusada de "perturbar a ordem e a segurança da sociedade", pois disseram que ela "estava espalhando sua crença", e por isso foi sentenciada a três anos de prisão e trabalho forçado. Enquanto estava a caminho da prisão, o policial disse que ela estava indo lá para aprender que a crença em Jesus era errada.

Abighail trabalhou na Shenyang, um campo de trabalho para mulheres que produzia artigos têxteis e produtos elétricos. O seu nome comercial era Shenyang Wanzhong Sanwei Service Company e possuía mil presas.

Em janeiro de 2007, alguns meses após ter cumprido sua pena, Abighail fugiu para os Estados Unidos, deixando sua família para trás.

Ironicamente, Abighail trabalhava produzindo pequenas lâmpadas para decorações natalinas, um item típico das festas cristãs.

Ela disse que as tarefas dadas eram muito difíceis de serem completadas em um dia. Eles acordavam às 7 da manhã e tinha gente que não conseguia terminar até meia-noite. Os que não completavam eram punidos. Ela também reclamou das condições de trabalho, dizendo que era muito frio na fábrica e não haviam aquecedores.


Outro dissidente religioso foi Charles Lee, preso por praticar a Falun Gong, uma mistura de exercícios de meditação e filosofia moral. Em 1999, a China começou a perseguir os seguidores da Falun Gong e prendeu 100.000 deles.

Em 2003, Charles Lee saiu da sua casa nos Estados Unidos para apoiar seus colegas na China. Acabou sendo preso e passou 3 anos na Laogai.

Passaram 1 ano tentando fazer lavagem cerebral, tentando forçar ele desistir de praticar o Falun Gong. Então eles mudaram e estratégia para fazê-lo sentir-se um criminoso. Charles trabalhou na prisão de Nanjing, a 170km de Xangai. Assim como todas as instituições penais da China, esta prisão também era um negócio. Seu nome comercial era Xinsheng Knit Sweater Factory, possuía 2600 presos e produzia calçados.

Um dos produtos feitos por Charles Lee eram pantufas com o formato do personagem Homer Simpson. Assim que ele saiu da prisão, em 2006, ele retornou para sua casa nos Estados Unidos e encontrou numa loja local as mesmas pantufas que produzia forçadamente em Nanjing.


Na etiqueta da pantufa aparece o nome da empresa SGFootwear, localizada em New Jersey, E.U.A.. De acordo com o site da empresa, ela possui licença para produzir e vender produtos com as marcas da Warner, Disney, Marvel, Fox e outras.

Perguntada pela reportagem da Al Jazeera, a 20th Century Fox diz que as fábricas da SG Footwear são monitoradas para obedecerem as leis de trabalho da China. Além disso, dizem que nunca utilizou conscientemente trabalho involuntário na criação de nenhum de seus produtos. A SGFootwear não comentou o assunto.


Oficialmente, a China baniu as exportações de todos os produtos feitos em prisões, mas a reportagem da Al Jazeera investigou e descobriu que isto continua acontecendo, com suporte do governo.


Dez anos atrás, Hari Wu se voluntarizou a ajudar um interno do Laogai. Ele era um dos gerentes (não era um preso) da maior produtora de botas de borracha na China (uma das prisões do Laogai) e disse que estava disposto a revelar tudo o que acontecia na prisão.

Com garantias do US State Department, Huang Peng fez sua parte e falou tudo. No entanto, o seu visto  como refugiado político da China acabou sendo negado. Assim, a Russia (onde ele estava temporariamente) acabou mandando-o de volta para a China.

Hari Wu não teve mais notícias do seu amigo. Ele acredita que Huang está preso na mesma prisão que ele trabalhava e tentou expor.

A TV Al Jazeera, que produziu este documentário e costuma publicar conteúdo revelando os podres da China, foi expulsa pelo governo chinês em maio deste ano: as credenciais de imprensa dos correspondentes dessa TV não foram renovadas.

Abaixo segue o vídeo completo deste episódio da série:


Felizmente, este assunto já está sendo debatido e divulgado por organizações como a Slavery Footprint. Vale à pena visitar o site http://slaveryfootprint.org/

Referências:

Information and Nature Analogy

If you're the only one who knows it and don't spread it, it will die, like a rare bird that didn't find its partner to reproduce and becomes extinct. It could even be a really innovative and striking idea, a new species of a bird, but thanks to your failure in sharing it, the result of millions of years of evolution would be thrown away.

However, some kinds of information are like viruses, and shouldn't be spread. They reproduce easily but pollutes the air and time, bringing difficulties for the info that really matters to reproduce in everyone else's minds.

Gossip, per example, is clearly classified as a virus information.
We have news channels that work like an abundant virus source, and those should be fought against, or ignored.

But you have to pay attention. Most of the times, viruses are not so easy to spot. They sound and look like authentic good information, but are actually fake, or misleading.

Jesus, for example, came up with a lot of new ideas, spreading love and comprehension. Centuries later, the very same words were used by some people to spread intolerance and persecution.

At the time you write or speak something, you may be starting a chain reaction. If your audience absorbs what you said, it will probably share it with someone else and this can last forever, literally. So take care on what you receive and what you give.

Curso sobre Propriedade Intelectual


Iniciei um curso de 75h sobre Propriedade Intelectual, fruto de uma parceria entre o INPI - Instituto Nacional da Propriedade Industrial e a OMPI - Organização Mundial da Propriedade Intelectual (WIPO, em inglês). É um curso oferecido à distância, em um site do WIPO (http://lms.wipo.int/index_pt.php), ensinado através de texto e áudio, dividido em 13 módulos. Também temos à nossa disposição um tutor, e um fórum para discutirmos os assuntos relacionados ao curso. Muito legal! O curso é gratuito, então se tiver interesse busque por DL 101P BR no Google e fique de olho nas próximas turmas. É bem provável que volte a ocorrer. Há informações nesta página aqui também, mas nunca se sabe até quando essas coisas ficam no ar:


   
Segundo o próprio site do curso, o objetivo é apresentar uma visão atualizada dos mecanismos de proteção das criações intelectuais, enfocando o arcabouço legal brasileiro e as atribuições do INPI.

E estes são os módulos oferecidos:

  1. GUIA DO CURSO
  2. INTRODUÇÃO À PROPRIEDADE INTELECTUAL
  3. DIREITOS AUTORAIS
  4. MARCAS
  5. INDICAÇÕES GEOGRÁFICAS
  6. DESENHO INDUSTRIAL
  7. PATENTES
  8. TRATADOS INTERNACIONAIS
  9. CONCORRÊNCIA DESLEAL
  10. PROTEÇÃO DE NOVAS VARIEDADES DE PLANTAS
  11. INFORMAÇÃO TECNOLÓGICA
  12. TRANSFERÊNCIA DE TECNOLOGIA
  13. DEBATE E RESUMO
  14. EXAME FINAL
Vou tentar postar um pouco sobre o assunto, durante o curso. Assim fixo melhor os conceitos e divulgo a informação, já que embora seja um assunto relevante, a maioria das pessoas conhecem pouco ou se sentem inseguras.


--Atualização em 8 de Novembro de 2012:

Consegui terminar o curso! Corri nesta semana para estudar quase todos os módulos, mas consegui ser aprovado. A exigência é uma pontuação acima de 50% no Exame Final, e consegui 80%. Mesmo tendo sido aprovado, não fiquei 100% contente, pois ainda não me considero entendido no assunto. Não por culpa do curso, que tinha muito conteúdo a oferecer, mas por eu não ter me dedicado como gostaria. De qualquer forma, tendo respondido todos os testes de cada módulo e o teste final, sempre consultando os textos, me fez ter uma visão menos leiga sobre os vários aspectos das proteções de Propriedade Intelectual. O que já é alguma coisa.
Estou com 100/100 em todos os módulos porque você tem a chance de refazer estes testes. O único que você tem apenas uma chance é o Exame Final, que também é o único que conta como instrumento de avaliação.



Como criar um projeto Django (Resumo)

Fonte: https://docs.djangoproject.com/en/1.4/intro/tutorial01/

django-admin.py startproject nome_do_projeto
(isto criará uma pasta com os arquivos iniciais do projeto)

Entre nesta pasta e teste se a criação funcionou com o comando:
python manage.py runserver
(depois acesse http://127.0.0.1:8000/)

Instalando MySQL e PHPMyAdmin
http://www.vivaolinux.com.br/dica/Servidor-Apache2-+-MySQL-+-PHP5-+-PHPMyAdmin-%28Ubuntu%29

Através do PHPMyAdmin, você pode criar a base de dados para seu novo projeto.

Configure sua nova base de dados em nome_do_projeto/settings.py
'ENGINE': 'django.db.backends.mysql'
'NAME': 'nome_da_base'
'USER': 'usuario_do_bd'
'PASSWORD': 'senha_do_bd'

Em nome_do_projeto/settings.py você também pode querer configurar o TIME_ZONE (exemplo: America/Recife) e os INSTALLED_APPS.

Após escolher os INSTALLED_APPS, você precisa construir o banco de dados de cada app. Isto é feito com:
python manage.py syncdb

Agora que está tudo pronto, você finalmente pode começar a desenvolver a primeira aplicação do seu projeto. Isto é feito com o comando:
python manage.py startapp nome_do_app

Agora você vai em nome_do_app/models.py e começa a modelar seu banco de dados.
Os tipo de campo você encontra aqui: https://docs.djangoproject.com/en/1.4/ref/models/fields/

Após a criação dos seus models, acrescente seu app na lista INSTALLED_APPS do arquivo nome_do_projeto/settings.py.
Basta acrescentar uma linha
'nome_do_app',
no fim da lista de apps.

Agora execute
python manage.py sql nome_do_app
e verifique quais comandos SQL seriam feitos para criar estes models no seu banco.

Outros comandos:
python manage.py syncdb
cria o seus models no banco.

  • Use a shell do Django para aprender a usar sua API e visualizar os dados da sua aplicação.
  • Lembre-se dos métodos __unicode__ em seus modelos (explicação no fim da seção do link acima).

O que aprendi com o I2P (Idea to Product)

Voltei de São Paulo no último domingo e decidi postar um pouco sobre a minha experiência por lá, após a minha participação no Idea to Product Latin America, realizado no Centro de Empreendedorismo e Novos Negócios da Fundação Getúlio Vargas (FGVCenn).

Entrada do salão nobre do FGVCenn, no primeiro dia da competição

Além das duas apresentações do Pluviara, assisti a outras 15 apresentações de projetos dos mais variados tipos, incluindo os respectivos modelos de negócio, que foram rigorosamente avaliados por especialistas da área, como Edson Rigonatti e Carlos Praes (O Boticário).

Apresentação do Pluviara na semifinal, na sala 703 do FGVCenn - Segundo dia do I2P

Com o passar das apresentações, o mais interessante já não era mais ouvir qual inovação tecnológica desenvolvida por cada equipe, mas sim em (i) como isto se transformaria num produto, (ii) o tamanho do mercado, (iii) se havia alguma demonstração de que realmente há uma demanda do mercado escolhido e depois ouvir as críticas dos especialistas após a apresentação. No segundo dia do evento, eu já estava fazendo mentalmente minha própria crítica das apresentações, para depois ver se tinha algo em comum com aquela feita pelo avaliador. Sinto que o evento não só despertou meu senso crítico em estratégias de empreendedorismo, como também me deu uma ideia do que é necessário em uma apresentação feita a investidores. O Professor Cristiano Araújo foi nosso mentor durante o evento e nos deu muitas orientações neste sentido.

Prof. Cristiano e eu, durante as apresentações do primeiro dia do evento. Na bancada atrás de nós, dois membros da FEBETECH: equipe que se sagraria campeã deste I2P, dois dias depois.
O evento é bastante diferente do que acontece no Centro de Informática (UFPE), nas apresentações do "Projetão" - disciplina oferecida pelo Professor Cristiano Araújo, de onde surge a maioria dos projetos do CIn que se inscrevem neste tipo de competição.

A questão central debatida no I2P é se você escolheu corretamente o mercado a ser atacado, se seu produto resolve o problema do cliente, se o mercado é grande o suficiente para sustentar sua empresa. No CIn, a feira de projetos serve como uma demonstração de alguma tecnologia ou serviço inovador implementado pelos estudantes. É uma demonstração da competência técnica dos estudantes do Centro. A questão mercadológica fica em segundo plano, servindo como uma introdução das preocupações de um empreendedor. O esforço maior da equipe é na utilização dos conhecimentos adquiridos durante o curso de computação para implementar o que foi proposto.

No mundo ideal, antes de implementar, os alunos deveriam pesquisar se o mercado existe mesmo e ir moldando o projeto de acordo com o feedback recebido do(s) cliente(s) ou dos testes feitos às hipóteses. No entanto creio que não haja tempo suficiente para tudo isto em um único semestre. Os alunos têm a ideia do produto primeiro, pesquisam se há algo similar no mundo, verificam se há viabilidade tecnológica e temporal (um protótipo deve estar pronto no fim do semestre), e só depois vão pensando em um possível modelo de negócios, sem validar nenhuma hipótese apresentada. Pelo menos isto foi o que aconteceu no semestre em que cursei a disciplina, que segundo o Professor, está em constante transformação.

Gostaria de aproveitar o post e agradecer a direção do Centro de Informática da Universidade Federal de Pernambuco, em especial aos Professores André Santos, Paulo Cunha e à Ivanilda da Silva, pelo financiamento do nosso transporte ao evento. Muito obrigado!

Pluviara no Idea to Product Latin America

Nessa semana recebi a notícia que um projeto que desenvolvi com meus colegas de graduação no ano passado acabou de ser aceito para competir na Idea to Product Latin America, promovida pela Fundação Getúlio Vargas, em São Paulo.



São 17 projetos oriundos de universidades de todo o Brasil e uma do México, que irão se encontrar nos dias 30 de Agosto a 1 de Setembro de 2012, para mostrar que a sua proposta é a mais viável comercialmente para se tornar realidade. Todos devem envolver tecnologia de uma forma inovadora, para solucionar um problema real (um Market Pain).

O vencedor do concurso estará automaticamente convidado para participar do Idea to Product Global, que irá acontecer em novembro em Estocolmo, Suécia.

O nosso projeto foi resultado de muito esforço durante 4 meses de concepção e desenvolvimento do protótipo. A concepção incluiu conversas com possíveis beneficiados pelo sistema, como o Ronaldo José da Emlurb, que nos explicou quais os problemas enfrentados durante as chuvas, e também especialistas de outros cursos de Engenharia da própria UFPE. Acredito que foi muito enriquecedor para todos que participaram.

A seguir um vídeo que fiz durante a apresentação do nosso projeto durante a "Feira de Projetos" que acontece todo semestre no Centro de Informática da UFPE, com projetos de alunos do oitavo período de Engenharia da Computação e quinto período de Ciência da Computação.


Ops! - Reciclando meu primeiro aplicativo Nokia para publicar na Loja Android

Hoje de madrugada terminei uma primeira versão do "Latão ou Latinha?" para Android. Então, só para aprender o processo de publicação, antes de melhorar a interface do aplicativo (tive umas ideias novas), resolvi pagar minha licença (US$25,00) e publicá-lo logo.

Aí vão algumas imagens dele rodando num celular emprestado:




Eis que resolvo buscar por algo parecido no Android Market e encontro:



Excelente o aplicativo. Design show de bola, tanto o título quanto a marca, e ainda tem um vídeo bem legal. Profissional mesmo. Ah, a empresa é daqui de Recife :)



Bom, no momento que vi, pensei "já era o meu app". Eu nunca tive uma grande expectativa em relação ao sucesso dele mesmo, era mais como um "Hello World" para eu aprender o básico do Android, mas eu queria que no mínimo fosse uma ideia nova.

Só que nem tudo está perdido. O aplicativo "Acertando NA LATA" tem um propósito bem específico: comparar cervejas. No entanto, o problema "comparar preços de produtos com volumes diferentes" existe para qualquer outro produto que possua volume: água, refrigerantes, azeite, detergente, água sanitária e por aí vai.

O desafio está em criar um aplicativo desse, com propósito geral (qualquer tipo de produto), mas que consiga um apelo comercial razoável, assim como um aplicativo relacionado a cerveja.

O apelo comercial de qualquer aplicativo relacionado a cerveja é bem alto. Em todo lugar existem vários apreciadores e fãs deste líquido/produto. Para muitas pessoas, qualquer coisa com "cerveja" em uma Loja de Apps já recebe uma atenção extra.

Uma funcionalidade que o "Acertando NA LATA" não tem é customizar os volumes. Provavelmente é para deixar a UI mais simples, mas isso implica na necessidade de a equipe sempre estar atualizando o aplicativo. A última atualização dele foi em 2011 e já há vários reviews pedindo para adicionar novos valores de volumes.



O meu app desde o início teve esse "plus". Ele dificulta um pouco a interação (você tem que ler o volume no produto e digitá-lo), mas acrescenta a possibilidade de torná-lo universal e comparar qualquer produto.

Bom, vou atrasar um pouco a publicação do meu primeiro app. Tentar dar uma recauchutada na apresentação e qualquer dia volto aqui com as novidades.

Atualização (07 de Outubro de 2012): Depois de mais de um mês postergando a publicação, decidi publicá-lo mesmo sem ter implementado as novidades que pretendia: https://play.google.com/store/apps/details?id=com.rodolfoferraz.android.lataooulatinha

Como montar um ambiente de desenvolvimento Android (no Linux)

Peguei emprestado o livro "Android Application Development for Dummies" e resolvi guardar aqui no /var/blog/ o quê e onde deve ser baixado os componentes do ambiente de desenvolvimento.

A criação de projetos, compilação, etc, eu imagino que eu vá decorar de tanto fazer, então não vou colocar aqui. Só a configuração do ambiente que talvez eu esqueça uns detalhes, então isto aqui é apenas para eu me lembrar quando precisar, e de quebra serve como guia para mais alguém.


1. Java JDK
http://www.oracle.com/technetwork/java/javase/downloads/



Baixe o .tar.gz

Instalando (fonte):
cd ~/Downloads
tar -vxf jdk-7u5-linux-i586.tar.gz
sudo mv ./jdk1.7.0_05 /usr/lib/jvm/jdk1.7.0

sudo update-alternatives --install "/usr/bin/java" "java" "/usr/lib/jvm/jdk1.7.0/bin/java" 1
sudo update-alternatives --install "/usr/bin/javac" "javac" "/usr/lib/jvm/jdk1.7.0/bin/javac" 1
sudo update-alternatives --install "/usr/bin/javaws" "javaws" "/usr/lib/jvm/jdk1.7.0/bin/javaws" 1

sudo update-alternatives --config java
e escolha a opção que for do jdk1.7.0

cheque se a versão que você instalou está sendo chamada
java -version

depois:

sudo update-alternatives --config javac
e escolha a opção que for do jdk1.7.0

sudo update-alternatives --config javaws
e escolha a opção que for do jdk1.7.0

2. Android SDK
http://developer.android.com/sdk/index.html


Após baixar o .tgz, extraia:
tar -vxf android-sdk_r20.0.1-linux.tgz

e mova para uma pasta definitiva, por exemplo, no seu home.
mv android-sdk-linux/ ~/code/linux-dev-env/


No README desta pasta você verá que precisa rodar o executavel "android" para abrir o SDK Manager e baixar pelo menos uma versão da plataforma Android e o Platform-tools. Faça isso.

3. Eclipse IDE



Importante: Para ver a versão do Eclipse que o SDK Android suporta (Galileo, Ganymede, Helios, e esses nomes todos), vá na mesma página de Downloads do SDK Android e clique em "System Requirements". No momento, ele pede "Eclipse 3.6.2 (Helios) or greater". Só que você também tem que o pacote do Eclipse, que pode vir com o ambiente Java, C/C++ e várias outras opções. Segundo esta página recomenda-se o Eclipse Classic, ou então a versão Java ou RCP.

Resumindo: baixei o Eclipse Classic mais recente.
http://www.eclipse.org/downloads/

Extraia o .tar.gz:
tar -vxf eclipse-SDK-4.2-linux-gtk.tar.gz
e mova a pasta para onde você quer que o Eclipse fique.
exemplo:
mv eclipse ~/code/linux-dev-env/


Agora com tudo instalado, vamos configurar o Eclipse.

Abra o Eclipse e vá em Help -> Install New Software

Clique em Add para adicionar um novo repositório.
No nome do repositório, coloque Android ADT, e no endereço, coloque https://dl-ssl.google.com/android/eclipse/

Aguarde um pouco até a lista de softwares aparecer e marque a linha "Developer Tools". Depois é só "Next>Next>Finish".

Depois de reiniciar o Eclipse, provavelmente ele pedirá a localização do Android SDK. Caso contrário, vá em Windows->Preferences e escolha "Android" no painel esquerdo

O diretório é aquele que você colocou o SDK no passo 2 desse post.

Pronto Eclipse configurado. Você está pronto para desenvolver.

-------------------

Caso você queira rodar/debugar seu aplicativo em um dispositivo real, em vez de utilizar o emulador no Eclipse, é necessário realizar o seguinte procedimento:(retirado de http://developer.android.com/tools/device.html )

Crie o seguinte arquivo:
/etc/udev/rules.d/51-android.rules
Com o conteúdo:
SUBSYSTEM=="usb", ATTR{idVendor}=="0bb4", MODE="0666", GROUP="plugdev"

Onde você deve substituir o 0bb4 pelo código da marca do dispositivo que você irá testar. A tabela de marcas/códigos encontra-se na página http://developer.android.com/tools/device.html



Depois execute
chmod a+r /etc/udev/rules.d/51-android.rules

Pronto. Se você tiver mais de um dispositivo para testar, adicione novas linhas no arquivo mencionado.

Software para smartphones e software dos anos 90, qual a diferença?

Assim que começou a febre dos smartphones, tudo era interessante. Uma sabre de luz sendo exibida na tela do celular, que ao ser balançado, emitia sons do Star Wars era motivo para baixar e mostrar aos amigos. Outro sucesso era um aplicativo que simplesmente tinha um botão que fazia som das Vuvuzelas da Copa do Mundo de 2010.

Isso lembra a época que computador pessoal era novidade.

Qualquer besteira era motivo para se empolgar. Os jogos que exibiam vídeos de filmagens reais, por exemplo, mesmo com uma qualidade horrível, já eram mais divertidos.(veja um vídeo de MegaRace 2!) Você jogava curioso para ver o vídeo seguinte. Também era normal encontrar revistas que vinham com um CD contendo "300 Jogos para Windows". Todos ávidos por instalar, instalar e instalar. Quanto mais programas no computador melhor!

Papel de parede do Windows 95. Nessa época, em que olhar a parte brilhante em baixo de um CD era interessantíssimo, esse papel de parede de alguma forma fazia eu me sentir em um futuro distante. Era muita modernidade pra uma imagem só.

Hoje em dia, para o usuário comum, é raro instalar um software novo no PC. A maioria das coisas que fazemos é através do browser. No entanto, em smartphones é normal ver pessoas que instalam tudo que vêem pela frente. Coisas que deixaram de ser interessantes há 15 anos atrás, voltaram a ser motivo de alegria, com o aparecimento dos smartphones.

O que mudou?

O que causava alegria nos anos 90 era a novidade visual e interativa. Pelo menos para mim, com 10 anos. Uma tela exibindo efeitos que nem na TV você via, e que você podia interagir, era fantástico. Hoje, a parte visual não é o atrativo principal do smartphone. O empolgante é ter tudo isso a qualquer momento, à sua mão. Mobilidade significa que aquela besteirinha quase sem graça que você baixou, pode ser usada para passar o tempo numa viagem de ônibus, numa fila de banco, ou então para decidir se abastece com Gasolina ou Álcool, utilizando um aplicativo bem simples, que num Desktop não serviria para quase nada, distante do posto de combustível.

O fato de você ter softwares ao seu lado a toda hora, marca o momento em que o homem se torna um bocado mais tecnológico e consequentemente mais poderoso. Assim como o homem do paleolítico, que com um pedaço de pau, tornou-se mais eficaz em suas caçadas.

http://en.wikipedia.org/wiki/File:Glyptodon_old_drawing.jpg
O desafio humano atual já não é mais a sobrevivência e sim a interconexão com os outros. O smartphone seria a pedra lascada dessa nova fase, e finalmente, quando não precisarmos mais levar nada em nosso bolso, e incorporarmos tudo isso ao nosso corpo, teremos chegado na pedra polida.

Seguindo a analogia, ainda vem a idade dos metais, mas deixo a correspondente contemporânea a cargo da sua imaginação.

Aula sobre Transistor Bipolar de Junção

Descobri há alguns meses um aplicativo para iPad (Educreations - é de graça!) que venho utilizando para estudar as disciplinas da graduação. Assim que aprendo algo que acho que vou esquecer, faço uma aula do que aprendi usando esse aplicativo.

Não só reforça o aprendizado, como você pode reaprender no futuro, ensinado por você mesmo. Ele não publica no Youtube (a ideia do aplicativo é eles terem o site próprio), mas descobri que tem como embutir em outros sites (eles fornecem o embedding code).

Bom, aí vai uma aula sobre o funcionamento de um Transistor. Eu tinha acabado de entender o assunto e não tinha intenção de compartilhar com ninguém, então fiz altas simplificações na explicação. Algumas podem até estar erradas, foi mais para eu entender o básico do funcionamento. Eu não cheguei a falar da teoria toda sobre transistor, sobre o PNP, foi apenas como funciona a polarização e a curva (gráfico), que era o que eu mais tinha dúvidas.

Eu tenho outras duas aulas publicadas no Educreations, mas sobre Sinais e Sistemas. Talvez eu coloque aqui no Blog depois.

Recomendo ver em FULLSCREEN!



E o meu perfil de lá é este: http://www.educreations.com/profile/757693/

Meus primeiros aplicativos para Smartphones

No dia 27/03 postei sobre um curso que eu estava fazendo no Centro de Informática, ministrado por funcionários do Instituto Nokia de Tecnologia (INdT). O curso era sobre desenvolvimento utilizando Qt, só que com um enfoque em jogos para celulares.

Tivemos aulas sobre como utilizar o QMLBox2D (uma espécie de engine física), e inclusive com o passar das aulas acompanhamos o desenvolvimento de um joguinho chamado "Cheese", que embora simples, deu para aprender algumas boas práticas de programação usando o Qt.

A ideia do curso era que no final, cada aluno publicasse seu próprio jogo na OVI Store. Além disso, a Nokia criou uma promoção que daria um smartphone para os alunos que publicassem no mínimo 3 aplicativos.



Quando estava chegando no final do curso (e ao mesmo tempo final do semestre da graduação), vi que não conseguiria publicar o jogo em tempo. No entanto, achei que fosse possível publicar os três aplicativos. Um jogo é um aplicativo com um nível de complexidade maior, não só em programação, como em concepção. Eu mesmo até agora não tenho uma ideia formada de como seria o jogo que quero publicar.

Enfim, na segunda-feira passada desenvolvi um aplicativo (chamado "Latão ou Latinha?") para trazer para a aula de Qt e aprender a publicar. Infelizmente aconteceram alguns problemas que impediram a aula de acontecer, então decidi aprender a publicar sozinho. É bem simples na verdade.

A intenção desse post não é ensinar nada disso (talvez eu faça depois), é mais para manter registrado a minha experiência. Foi um curso excelente. Principalmente porque o pessoal do INdT é muito competente. Um curso desse nível e ainda de graça, eu não poderia perder.

O prazo final de entrega dos três aplicativos era hoje (Sábado, 30 de Junho de 2012). Como eu tive prova ontem e antes de ontem, só fui voltar para o Qt na sexta à noite mesmo. E aí iniciou-se a saga.


Como eu não tinha instalado o Qt para o Harmattan (necessário para o MeeGo - Nokia N9), deixei baixando durante a madrugada. Parece brincadeira, mas acordei às 7:30 empolgado para enfrentar esse desafio. Nem me levantei da cama direito, já sentei na cadeira e vi que o download tinha acabado. Finalizei uns detalhes do "Latão ou Latinha?" e consegui submeter para a revisão QA (Quality Assurance) da Nokia. Em cerca de 7 dias eles dão o resultado e possivelmente publicam na loja OVI.


E aí só agora de dez e meia de noite submeti o terceiro aplicativo. A sensação é muito boa. Não só por estar concorrendo a um smartphone legal da Nokia, mas também porque sinto que o curso que me inscrevi e me dediquei valeu à pena.

Enfim, aí vai um resumo de cada aplicativo submetido, assim como screenshots (não poderia faltar).



Latão ou Latinha?
https://publish.nokia.com/download_items/show/516780
"Descubra de forma simples se vale à pena comprar a lata de cerveja com tamanho comum (390ml), ou a cerveja mais comprida, conhecida como Latão (473ml). Também serve para comparar com outros tamanhos."




28h-Hour Clock
https://publish.nokia.com/download_items/show/516846
É um relógio para pessoas que quiserem seguir uma convenção diferente para a quantidade de dias/horas numa semana. São 6 dias de 28h. Tenho um texto sobre isso em: http://blog.rodolfoferraz.com/2012/05/e-se-partir-de-agora-os-dias-durassem.html



Simulador de Investimentos
https://publish.nokia.com/download_items/show/516857
Com este aplicativo, você pode calcular quanto terá de dinheiro em um investimento de renda fixa, levando em conta o seu investimento inicial, o investimento mensal, e a rentabilidade do investimento.


Esse relato também dá uma ideia do quão simples é criar um aplicativo usando o Qt. Eu que tenho pouquíssima experiência, consegui fazer três aplicativos em cerca de um dia e meio. Minha impressão é que no terceiro aplicativo, já saía tudo mais fácil. Então a tendência é que leve menos tempo ainda. Muita coisa eu ia consultar na documentação, e no final, algumas coisas eu já tinha de cabeça, e reaproveitava código das aplicações anteriores também.

Depois disso tudo ainda tive coragem de escrever esse post, para relatar a minha humilde vitória. Dias tão produtivos como esse são difíceis de acontecer. 3 aplicativos e 1 post no blog... só acordando às 7:30 de um sábado mesmo.

Acessando o OpenSUSE 11.4 através de SSH

Atenção: Esse passo-a-passo é apenas para tornar possível o acesso via SSH por máquinas na rede interna. Se sua máquina estiver por trás de um roteador, é necessário configurar o "port forward" para ser acessado pela rede externa também.

O OpenSUSE 11.4 já vem com o OpenSSH instalado. A única coisa que se tem a fazer é ativar o serviço e configurar o Firewall para permitir acesso pela porta 22.

Primeiro confirme se o serviço está ativado:
Vá em System > System > YaST.
Nessa janela, desca a barra de rolagem até o fim, e na seção System você terá um ícone de um ônibus espacial da NASA com o título "System Services (Runlevel)".



Aparecerá uma lista de serviços. Procure por sshd (SSH Daemon). Ele deve ter o valor "Yes" na coluna Enabled. Senão, sete para este valor, clicando no botão Enable.

Agora configure o Firewall indo no mesmo YaST, só que na seção "Security and Users". Lá terá o ícone de um muro com cadeado e o título "Firewall". Desligue o Firewall e teste se já é possível acessar sua máquina remotamente através do ssh. Se sim, o serviço está ativo. Só falta configurar o Firewall.

Vá na seção Allowed Services do OpenSUSE, no combobox "Service to Allow:" escolha Secure Shell Server e clique em Add. A tela ficará assim. Dê Next, depois Finish.


Agora deve ser possível acessar a sua máquina com o Firewall ligado.

E se, a partir de agora, os dias durassem 28h?


Seja por não administrar bem o seu tempo e estar na véspera de um deadline, prova, ou querer mais algumas horas de sono e lazer, muitas pessoas, no mínimo uma vez, já desejaram que o dia durasse mais do que 24 horas.

Como tornar prática esta ideia? Já aconteceu de alguns milhões de pessoas combinarem, através da internet, de pular e cair com toda a força no chão, seguindo uma certa ordem de acordo com sua latitude e longitude, na esperança de causar algum impacto na órbita da Terra e até na duração dos dias. Claro, era uma brincadeira, mas e se, simplesmente, desfizéssemos a convenção que um dia possui a mesma duração de uma rotação completa da Terra?

Por exemplo, poderíamos definir que o dia, a partir da meia-noite desta segunda-feira, dura 28 horas, independente do Sol ou qualquer outra coisa. Quais as consequências disso?

Primeiro, para a semana continuar com a sua mesma duração, teríamos que tirar um dia, ou seja, seria uma semana de 6 dias (6x28h dá a mesma quantidade de horas que 7x24h).

Outra coisa, não haveria mais "cinco horas da tarde" ou "três horas da manhã". Cada dia teria um ciclo diferente, e as mesmas horas, em dias diferentes, apresentariam posições solares diferentes. Poderia acontecer até de em um único dia o sol nascer (ou se pôr) duas vezes.

Na segunda-feira do Recife, por exemplo, o Sol nasceria por volta das 5h30 e o crepúsculo aconteceria às 17h30. Tudo normal, tirando o fato de a terça-feira só começar após as 27h59. Todos os relógios atuais se tornariam inúteis.

Qual o impacto disso no nosso dia-a-dia? Hoje em dia, normalmente segue-se a lei do um-terço. Um terço para sono, um terço para trabalho e um terço para lazer, i.e. 8h cada. No entanto, graças ao trabalho passamos no mínimo 10h fora de casa (almoço, trânsito, etc.) sobrando no máximo 14h para sono e lazer.

E com 4 horas a mais? Poderíamos distribuí-las igualmente entre sono e lazer, por exemplo. Duas horas extras para cada.

Abaixo segue uma imagem para ajudar quem quiser fazer esta experiência alguma vez. Os dias da nossa nova semana estão nomeados como "Dia 1", "Dia 2" e assim por diante, todos encaixados sobre a semana normal de sete dias. Com esta imagem, podemos saber que horas devemos dormir (em azul) e até se o céu estará claro durante o almoço (em amarelo).


No "Dia 1", acordaríamos às 7:00, depois de longas 9h de sono, tomaríamos nosso café-da-manhã, ainda veríamos um pouco de TV, e aí seguiríamos para o trabalho, sem muita pressa. Chegaríamos às 9h, sem todo aquele sono e mau-humor típico da segunda-feira, afinal, dormimos super bem.

Voltaríamos após o anoitecer, às 19:00 e aí teríamos tempo de ir à academia, estudar e se quiséssemos, assistir a dois filmes antes de dormir, às 26:00 ainda do "Dia 1" (ou 2:00 da manhã da terça-feira convencional).

Outras pessoas também já tiveram a mesma ideia. Inclusive encontrei um site bacana sobre o tema:
http://www.dbeat.com/28/

Que tal?

Descobrindo senhas no Active Directory da Microsoft por Brute Force

Esses dias descobri o que significa LDAP.

Precisei migrar para Linux uma aplicação (desenvolvida para Windows) que aproveita o Active Directory da Microsoft para fazer autenticação dos usuários. Isso significa que todo o gerenciamento das contas dessa aplicação pode ser feito através do Windows, além de a mesma conta também servir para fazer logon em máquinas da rede em que o A.D. está.

Para acessar os dados do Active Directory, utiliza-se o protocolo LDAP. Como o LDAP é um protocolo aberto, há bibliotecas que o implementam tanto no Windows como no Linux. Desta forma, usuários de uma rede heterogênea (sistemas operacionais diferentes) conseguem fazer logon utilizando os mesmos dados (login/senha).

Enquanto testava a autenticação na rede local utilizando OpenLDAP, não resisti em fazer um loop com várias tentativas para ver se o A.D. impedia algo. Como não percebi nenhum impedimento, deixei um programinha tentando descobrir minha senha da rede e ele conseguiu em 16 horas! Era uma senha simples, e com a agilidade do servidor LDAP em responder as requisições, ficou ainda mais fácil.

A rede do Centro de Informática da UFPE utiliza o mesmo protocolo, e com uma quantidade tão grande de usuários (provavelmente mais de mil), passa a ser perigoso deixar essas brechas de segurança. Acho que foi por isso que recentemente os requisitos para criação/alteração de senhas mudaram. Agora é necessário no mínimo 7 caracteres, contendo números, letras maiúsculas e minúsculas e caracteres não alfa-numéricos. Isso aumenta muito a complexidade da senha, a ponto de impossibilitar (creio) a descoberta por brute-force (uma vez que também há obrigação de trocá-la a cada 6 meses ou algo assim).

Ao buscar no Google, vi que isso já era algo "manjado". Inclusive encontrei alguns artigos que abordam o assunto com técnicas para contornar o que seria um problema de segurança. Basta buscar por active directory brute force.

Primeiras impressões de Qt

Hoje assisti a primeira aula de um curso de introdução a Qt, oferecido pela Nokia no Centro de Informática da UFPE. A intenção é que, após oito aulas de quatro horas, estejamos com um jogo publicado na Ovi Store. A proposta é muito instigante.

Foto Aula Qt
Primeiros minutos do curso introdutório de Qt

Thiago Lacerda, do Instituto Nokia de Tecnologia (INdT), iniciou a aula dando uma visão geral do Qt e seu SDK. Logo após, colocamos a mão na massa e codificamos no QtCreator (IDE do Qt). Foram duas aplicações simples para console. Na primeira, criamos uma classe (derivada de QObject) com três timers, que imprimia o ID de cada timer ao expirar seu tempo. Para criar os timers, não precisamos de nenhum objeto membro. Bastou chamar startTimer(int msec), herdado de QObject, para criar em tempo de execução quantos timers quiséssemos. E para imprimir o ID na tela, bastou dar overload no método timerEvent (também de QObject), e colocar o código de impressão do ID do evento.

Foi meu primeiro contato com o QtCreator. A sensação de ter uma IDE que digita praticamente tudo para você é muito bom. É parecido com o Eclipse, só que o QtCreator por algum motivo parece ser mais "confortável". Talvez seja o fato de ter uma poluição menor de opções nos menus. É mais fácil de encontrar as coisas.

Minha única queixa foi em relação às mensagens de erro. Várias vezes erros meus levaram a mensagens de erro apontando para partes internas do Qt. Erros devido à falta de #includes também não eram claros. Se não me falha a memória, em certo momento, tudo que eu precisava era um "QTimerEvent undefined", pois não havia incluído <QTimerEvent>. Mas o que o Qt imprimia na saída de erros, não tinha muito a ver com isso.

Mas isso não me desencorajou a utilizar o Qt. A extensa e bem feita documentação online, IDE com excelente interface, assim como a enorme base de usuários (é fácil encontrar soluções de problemas de Qt no Google), dá a impressão que desenvolver em Qt deve ser muito tranquilo.

Para quem nunca ouviu falar, Qt é basicamente uma biblioteca enorme, em C++, feita para ser compilada em diversas plataformas: De Windows, Mac, Linux até iOS, Android, Symbian.  Além da biblioteca, também existe o kit de desenvolvimento, constituído de IDE e outras facilidades, como UI designer tipo drag-and-drop e simuladores para plataformas móveis.

Bom, estas foram as minhas primeiras impressões de Qt. A próxima aula é sobre QML, que segundo Daker Fernandes (INdT), é a mais importante do curso. Até lá, então!

Eficiência em C++: passar um objeto por referência-para-const

Sempre que definimos uma função como:

void check(User u);

e a chamamos

User u1;

check(u1);


o objeto User é passado por valor, como também acontece em C.

Assim, o que temos dentro da função check é uma cópia do objeto u1, o que significa que foi preciso chamar o copy-constructor de User para criar u a partir de u1. Além disso, ao terminar a função check, também é preciso chamar o destrutor de User, já que u saiu de escopo.

Há como fazer o mesmo gastando menos?
Se você quer apenas capturar uma informação do usuário u1 (não quer modificá-lo), você pode economizar estas chamadas ao construtor e destrutor de User (que podem ser mais custosas do que parece, por exemplo, se esta classe tiver muitos membros, for derivada de outra classe (neste caso chamaria também o construtor da classe base), entre outros detalhes).

Para tornar seu código mais eficiente, basta passar o objeto User como referência para const.
A assinatura da função fica:

void check(const User& u);

A chamada da função continuaria a mesma:

User u1;

check(u1);

Qual a consequência disto?

Em primeiro lugar, não será chamado construtor algum. É como se estivesse sendo passado um ponteiro para a função check, só que sendo uma referência (em vez de um ponteiro), você não dá à função check o poder de modificar o objeto original, assim como quando se passa por valor - é criada uma cópia dentro da função. A segunda vantagem é que o código da função não muda. A utilização da referência é igual a como se tivesse sido passada por valor, como se u fosse um objeto. Isto é bom, pois o ganho com eficiẽncia não traz complexidade ao código e você pode fazer um upgrade na performance do seu programa alterando apenas a assinatura da função.

'Converting Constructor' e 'Explicit' em C++

Em C++, se você possuir uma classe MeuInteiro e criar para ela um construtor que recebe apenas um objeto (por exemplo, um int) como argumento, ao fazer um assignment de um objeto int para um MeuInteiro, este construtor será executado.

Exemplo:

#include ⟨cstdio⟩

class MeuInteiro {
public:
        MeuInteiro(int);
};

MeuInteiro::MeuInteiro(int _x)
{
        printf("Construtor MeuInteiro(%d)\n", _x);
}

int main(void)
{ 
        MeuInteiro m = 10;
        return 0;
}

A saída deste programa será:


Construtor MeuInteiro(10) 

Esta conversão de tipo também acontece ao passarmos um inteiro como argumento para funções que recebam o objeto MeuInteiro. Por exemplo, se adicionarmos a função func que recebe um MeuInteiro:

void func(MeuInteiro _m)
{
        printf("func(MeuInteiro);\n");
}


E a chamarmos no main passando um inteiro como argumento:

int main(void)
{ 
        MeuInteiro m = 10;
        func(15);
        return 0;
}


A saída será:
Construtor MeuInteiro(10)
Construtor MeuInteiro(15)
func(MeuInteiro);

No entanto, se você não quiser que essa conversão implícita aconteça, você pode acrescentar a keyword explicit ao construtor. Desta forma, haverá erro de compilação, pois não é possível converter  int para MeuInteiro.

Aqui vai o exemplo, que demonstra o parágrafo anterior, e sua saída:

convconstr.cpp
#include ⟨cstdio⟩

class MeuInteiro {
public:
        explicit MeuInteiro(int);
};

MeuInteiro::MeuInteiro(int _x)
{
        printf("Construtor MeuInteiro(%d)\n", _x);
}

void func(MeuInteiro _m)
{
        printf("func(MeuInteiro);\n");
}

int main(void)
{ 
        MeuInteiro m = 10;
        func(15);
        return 0;
}

Saída:
g++ -Wall convconstr.cpp -o convconstr

convconstr.cpp: In function ‘int main()’:
convconstr.cpp:20:17: error: conversion from ‘int’ to non-scalar type ‘MeuInteiro’ requested
convconstr.cpp:21:9: error: conversion from ‘int’ to non-scalar type ‘MeuInteiro’ requested

Estas chamadas implícitas também acontecem com o copy-constructor. Mas tornar o copy-constructor explicit provavelmente será má ideia. Uma classe com o copy-constructor explícito significa que não é possível passar objetos por valor a nenhuma função, ou realizar inicializações utilizando o operador =. Aqui há uma thread do cplusplus a este respeito: http://www.cplusplus.com/forum/unices/62973/

Série de posts sobre C++ Eficaz

Embora minha experiência nesta linguagem seja quase nula, estou há quase um mês desenvolvendo em C++. Não tive muito tempo de ler sobre as peculiaridades da linguagem (que são muitas) e estou aprendendo à medida que cometo erros.

O problema é que o sistema está crescendo e os erros estão ficando cada vez mais difíceis de resolver. Sem contar que tenho a impressão que o código está inconsistente, com classes que fazem praticamente a mesma coisa, com padrões diferentes, já que não sigo padrão algum.

Por isso procurei por um livro que pudesse me guiar em como ser correto e eficaz em C++, sem entrar em detalhes sobre a sintaxe, que se encontra em qualquer site, e sim detalhes sobre implementação. O que se deve e o que não se deve fazer. Eis que encontrei o Effective C++: 55 Specific Ways to Improve Your Programs and Designs (3rd Edition) por Scott Meyers.



Então, seguindo a dica de Confúcio, resolvi reproduzir aqui neste blog o que estou aprendendo no livro.

"Ouço e esqueço. Vejo e me lembro. Faço e entendo." - Confúcio.


Creio que a leitura por si só não é suficiente para mim. Entendo o que está sendo dito, mas não memorizo. Quando você precisa explicar para alguém, aí sim, é um sinal de que você aprendeu.

Então vamos lá.

Problema com playback de vídeo no Ubuntu

Há muito tempo que eu não consigo ver filmes/vídeos nos players do Ubuntu. Youtube funcionava legal, mas era só ver vídeos fora do browser, que eu era levado de volta pra tela de login (reiniciava/deslogava).

Hoje decidi tentar novamente e encontrei a solução:
http://ubuntuforums.org/showthread.php?t=1763770

O último post resolveu:
install vlc, and although that also crashes when trying to load any video. All it took to fix it was to go into vlcs advanced video properties and change the video output module to X11. fixed everything right up for me.
Agora, se não me engano, não tem nada que me faça escolher o Windows 7, na tela do GRUB.

Adição feita em 10 de Março de 2012: Na verdade, voltei a ter algumas más experiências com reprodução de vídeo no Ubuntu. O VLC às vezes fica muito lento, ficando difícil até para pausar o vídeo. Hoje, inclusive, ao tentar reproduzir um vídeo do site da Apple (utilizando Quicktime), o Ubuntu reiniciou sozinho. Se tem uma coisa que não combina com Ubuntu na minha máquina, é vídeo. E outra coisa, quando escrevi a última frase do post, me esqueci do iTunes. Infelizmente não há iTunes para Linux. Não sei se dá para sincronizar os dispositivos Apple utilizando máquina virtual.

Adição feita em 15 de Outubro de 2012: Depois de vários meses utilizando o Linux Mint 13 Maya com resolução 1024x768 resolvi procurar novamente a solução para a placa integrada SiS 671/771 e encontrei aqui http://www.sempreupdate.com.br/2012/09/configure-drivers-da-sis-no-linux.html . O problema do vídeo, resolvi novamente setando a saída padrão com X11 no player de vídeo (VLC).