domingo, 31 de março de 2013

Problema de Lógica: A balança com defeito

Francisco e sua irmã Ana estão com seu cachorro Simba na farmácia de seu tio. Na farmácia há uma balança com defeito que só mostra corretamente os pesos superiores a 50 kg. Para evitar o defeito, pesaram-se juntos dois a dois e obtiveram os seguintes pesos:

Francisco e Simba pesam juntos 88 kg;
Francisco e Ana pesam juntos 114 kg;
Ana e Simba pesam juntos 60 kg.

Qual é o peso de Francisco, de Ana e do cachorro Simba?





RESPOSTA





De acordo com o enunciado, os valores obtidos nas pesagens de Francisco (x), Ana (y) e Simba (z), dois a dois, foram:

A) x + z = 88
B) x + y = 114
C) y + z = 60

Fazendo A - B, teremos:

D) (x + y) - (x + z) = 114 - 88
D) x + y - x - z = 26
D) y - z = 26

Fazendo C - D, teremos:

E) (y + z) - (y - z) = 60 - 26
E) y + z - y + z = 34
E) z = 17

Fazendo A - E, teremos:

(x + z) - z = 88 - 17
x = 71

Fazendo C - E, teremos:

(y + z) - z = 60 - 17
y = 43

Portanto, Francisco pesa 71 kg, Ana pesa 43 kg e Simba pesa 17 kg.

domingo, 3 de março de 2013

Ajustar níveis de cor no tratamento de texto digitalizado

Um texto impresso em papel e digitalizado para um arquivo de imagem pode conter diversas interferências, que comprometam a qualidade da cópia digital. Desconsiderando o desempenho do dispositivo de digitalização (scanner), o próprio impresso pode dificultar uma boa digitalização. A cor do papel, o tipo do papel, a qualidade da impressão e até a gramatura que, quando pequena deixa o papel um pouco transparente e assim a impressão do verso torna-se levemente visível na frente. Tudo isso influencia no resultado final.

Quase sempre é preciso fazer alguma correção na imagem do texto digitalizado. Felizmente temos os softwares de tratamento de imagens, que não são somente para fotografias pois são capazes também de tratar desenhos e textos digitalizados.

Este artigo mostra uma ferramenta de cor, a ferramenta de níveis de cor, que realiza um tratamento muito bom para este tipo de imagem digitalizada. O software utilizado na demonstração desta ferramenta é o GIMP (www.gimp.org), um software gratuito com muitos recursos e disponível para Linux e Windows.

O texto é basicamente uma imagem de duas cores, a cor do fundo, que é a cor do papel, e a cor do texto, que é a cor da tinta da impressão. Apenas ajustando os níveis podemos modificar os pixels para que eles se concentrem no preto e no branco. Poderíamos converter a imagem para a paleta preto e branco de 1 bit mas nisso perderia-se a suavidade dos caracteres, ou usar a ferramenta de contraste mas esta não permite um controle preciso no nível da cor preta e da cor branca.

A ferramenta de níveis de cor proporciona uma funcionalidade semelhante a ferramenta de histograma, entretanto, pode alterar o alcance da intensidade, tornar a imagem mais clara ou mais escura, alterar o contraste e corrigir a cor predominante. No GIMP, a ferramenta de ajuste de níveis de cor está acessível pelo menu "Cores/Níveis..." (Colors/Levels).

Vamos iniciar o nosso exemplo com esta imagem de um texto digitalizado. Veja que a cor dos caracteres está fraca, o papel está acinzentado e é possível perceber a impressão do verso:


Imagem digitalizada original

Abrindo a janela da ferramenta de ajuste de níveis de cor vemos o histograma linear na imagem, nos níveis de entrada. O histograma mostra a quantidade de pixels em cada nível de cor. O eixo horizontal vai do nível 0 (preto) ao nível 255 (branco) e a quantidade de pixels por nível está no eixo vertical. A área da curva representa todos os pixels da imagem.

No histograma desta imagem original vemos dois picos, o da esquerda é referente aos pixels próximos do preto e o da direita é referente aos pixels próximos do branco. Perceba que a quantidade de pixels próximos do branco é bem maior pois a área livre (sem impressão) do papel é predominante. Os pixels próximos do preto são os caracteres. Abaixo este histograma original:


Histograma da imagem original

Não mostrarei todas as funcionalidades desta ferramenta de níveis, apenas os ajustes dos níveis de entrada, que são suficientes para o propósito deste artigo. No combo do canal deixe em "Valor", significa todos os canais.

Os níveis de entrada são ajustados pelos três triângulos deslizantes, ou pelos conta-gotas (desnecessário neste artigo), ou pelas três caixas de valor numérico. São três pontos porque o da esquerda seleciona o ponto negro, o da direita seleciona o ponto branco e o do centro ajusta o gama, o ponto médio.

Reposicionando o ponto negro faz com que todos os pixels, que possuírem este valor ou menos, tornem-se pretos. Assim, vamos posicioná-lo para alcançar todos os pixels referentes aos caracteres. Abaixo o histograma ajustado no ponto negro e a imagem digitalizada após este ajuste:


Histograma com ajuste do ponto negro


Imagem resultante

Podemos ver que os caracteres estão quase que totalmente pretos.

Reposicionando o ponto branco faz com que todos os pixels, que possuírem este valor ou mais, tornem-se brancos. Assim, vamos posicioná-los para alcançar todos os pixels referentes ao papel. Abaixo o histograma ajustado no ponto branco e a imagem digitalizada após este ajuste:


Histograma com ajuste do ponto branco


Imagem resultante

Podemos ver que o papel está completamente branco.

O que foi feito até agora foi o ajuste isolado de cada ponto, para mostrar o seu respectivo efeito. O tratamento final da imagem digitalizada está no reposicionando dos dois pontos, o negro e o branco, fazendo o ajuste em conjunto. Abaixo o histograma ajustado no ponto negro e no ponto branco e a imagem após este ajuste. Temos agora a imagem final:


Histograma com ajustes de ambos os pontos


Imagem resultante final

O texto está bem mais nítido, com o contraste adequado e o papel (fundo) sem qualquer sujeira. Volte lá na imagem original e compare com esta. Agora perfeito, não? A ferramenta de ajustes dos níveis de cor é mais eficiente em eliminar as sujeiras no papel. As vezes, existem pontos que são escuros o suficiente para confundir com os caracteres e esta ferramenta possibilita distanciá-los do preto e aproximá-los do branco.

O reposicionamento do ponto médio pode ser feito se desejar alterar o gama. Indo para a esquerda, para o preto, a imagem fica mais clara, indo para a direita, para o branco, a imagem fica mais escura. Nestes exemplos estou mantendo no 1 para evidenciar o efeito dos outros níveis.

Apenas com este ajuste dos níveis de cor podemos obter uma imagem, de um texto digitalizado, muito mais agradável para leitura. Inclusive, facilita o reconhecimento ótico dos caracteres (OCR), caso o propósito da imagem seja para este procedimento, o software não sofrerá com as interferências. Boas digitalizações!

sábado, 2 de março de 2013

Pausa em shell script

A execução de um script no interpretador de comandos do Linux (este artigo adotando o Bash) pode ser pausada por meio de dois artifícios. Um é o comando interno "read" e o outro é o comando "sleep". O "read" pode ser utilizado para esperar o pressionamento de uma tecla e o "sleep" para que espere por determinado tempo.

A seguinte linha, em determinado ponto do script, faz uma pausa na execução, neste ponto, e deixa o script esperando o pressionamento da tecla Enter:

read -p "Pressione [Enter] para continuar ou CTRL+C para sair..."

Como CTRL+C interrompe a execução do script, pode-se aproveitar para informar esta possibilidade.

Se desejar uma pausa controlada por tempo, a seguinte linha em determinado ponto do script faz uma pausa na execução por, no caso, 5 segundos:

sleep 5

O padrão para o "sleep" é em segundos mas pode-se adicionar o sufixo m para minutos, h para horas ou d para dias.

Os dígitos verificadores do CPF/CNPJ

O CPF (Cadastro de Pessoa Física) e o CNPJ (Cadastro Nacional da Pessoa Jurídica) são cadastros para identificar uma pessoa perante a Receita Federal do Brasil. O CPF possui um número com 9 dígitos, denominado raiz, e o CNPJ possui um número com 12 dígitos, raiz mais sufixo. Estes números, são complementados por dígitos verificadores (DV), totalizando 11 dígitos no CPF e 14 dígitos no CNPJ. Estes dígitos verificadores servem para conferir a integridade e autenticidade do número, evitando erros de digitação, números falsos etc. O número do CPF tem o formato xxx.xxx.xxx-vv e o número do CNPJ tem o formato xx.xxx.xxx/xxxx-vv, os dígitos verificadores são os dois últimos, nos dois cadastros.

Cada dígito verificador é calculado separadamente e o primeiro entra no cálculo do segundo. O algoritmo do cálculo é denominado Módulo 11, cada dígito verificador é gerado pelo resto da divisão por 11, e o que é dividido é o somatório dos dígitos do número e seus respectivos pesos.

Os dígitos dos números do CPF e CNPJ recebem pesos antes de serem somados. Para o CPF o peso é crescente em uma unidade de 2 em diante, até a quantidade de dígitos. Para o CNPJ o peso também é crescente em uma unidade de 2 em diante mas até 9, retornando a 2 e repetindo a sequência até a quantidade de dígitos. Esta quantidade de dígitos é ampliada no cálculo do segundo DV pois o primeiro DV entra como parte do número raiz do CPF e CNPJ.

CPF:
Pesos do 1º DV: 2, 3, 4, 5, 6, 7, 8, 9, 10      (para os 9 dígitos do número)
Pesos do 2º DV: 2, 3, 4, 5, 6, 7, 8, 9, 10, 11  (para os 9 dígitos do número mais o 1º DV)

CNPJ:
Pesos do 1º DV: 2, 3, 4, 5, 6, 7, 8, 9, 2, 3, 4, 5     (para os 12 dígitos do número)
Pesos do 2º DV: 2, 3, 4, 5, 6, 7, 8, 9, 2, 3, 4, 5, 6  (para os 12 dígitos do número mais o 1º DV)

Os dígitos dos números recebem os pesos na ordem do menos significativo ao mais significativo, isto é, da direita para a esquerda. Então a sequência dos pesos fica invertida. Cada dígito é multiplicado ao seu respectivo peso. Os produtos são somados e então divididos por 11.

Cada dígito verificador é gerado a partir do resto desta divisão por 11. Se o resto for 0 ou 1 o dígito verificador será 0, se o resto for maior que 1 o dígito verificador será a subtração de 11 pelo resto. Esta regra é a mesma tanto no CPF como no CNPJ, o que mudam são somente os pesos.

Os exemplos a seguir mostram os cálculos dos dígitos verificadores de um número CPF e de um número CNPJ. Perceba que o primeiro peso da sequência vai para o dígito mais à direita. No cálculo do 1º DV este dígito mais à direita (menos significativo) é a unidade do número raiz no caso do CPF e a unidade do sufixo no caso do CNPJ. Já no cálculo do 2º DV o primeiro peso vai para o 1º DV, que entrou no número à direita:


CPF nº 147.258.369

(1x10)+(4x9)+(7x8)+(2x7)+(5x6)+(8x5)+(3x4)+(6x3)+(9x2)
   10 +  36 +  56 +  14 +  30 +  40 +  12 +  18 +  18  =  234

O resto da divisão de 234 por 11 é 3, portanto o 1º DV é 11-3, que é igual a 8. O CPF fica, por enquanto:

CPF nº 147.258.369-8

(1x11)+(4x10)+(7x9)+(2x8)+(5x7)+(8x6)+(3x5)+(6x4)+(9x3)+(8x2)
  11  +  40  +  63 +  16 +  35 +  48 +  15 +  24 +  27 +  16  =  295

O resto da divisão de 295 por 11 é 9, portanto o 2º DV é 11-9, que é igual a 2. O CPF completo é 147.258.369-82.


CNPJ nº 14.725.836/0001

(1x5)+(4x4)+(7x3)+(2x2)+(5x9)+(8x8)+(3x7)+(6x6)+(0x5)+(0x4)+(0x3)+(1x2)
  5  +  16 +  21 +  4  +  45 +  64 +  21 +  36 +  0  +  0  +  0  +  2  =  214

O resto da divisão de 214 por 11 é 5, portanto o 1º DV é 11-5, que é igual a 6. O CNPJ fica, por enquanto:

CNPJ nº 14.725.836/0001-6

(1x6)+(4x5)+(7x4)+(2x3)+(5x2)+(8x9)+(3x8)+(6x7)+(0x6)+(0x5)+(0x4)+(1x3)+(6x2)
  6  +  20 +  28 +  6  +  10 +  72 +  24 +  42 +  0  +  0  +  0  +  3  +  12 =  223

O resto da divisão de 223 por 11 é 3, portanto o 2º DV é 11-3, que é igual a 8. O CNPJ completo é 14.725.836/0001-68.


Estes cálculos são frequentemente utilizados em sistemas computacionais para testar a veracidade dos números. Impede erros de digitação e detecta números falsos caso alguém queira inventar um número mentalmente. Obviamente, é possível inventar fazendo todos os cálculos para os dígitos verificadores, no entanto, as pessoas normais precisam de pelo menos um lápis e um papel para isso.

Observações: Nos números de CNPJ emitidos antes de 1993 (nesta época ainda era chamado CGC), o 8º dígito (o menos significativo) é um DV módulo 10 dos sete dígitos anteriores. A partir de 1993 o CNPJ não foi mais gerado assim. Os números de CPF e CNPJ usados nos exemplos deste artigo foram inventados por mim, pela posição das teclas em meu teclado. Se estes números estão sendo utilizados por alguém, esta pessoa é sortuda, possui uma sequência de teclas.

domingo, 24 de fevereiro de 2013

Servidor de desktop remoto no Linux

O Remote Desktop Protocol (RDP) é um protocolo de rede desenvolvido pela Microsoft para acessar o ambiente de desktop de um outro computador. No sistema Windows é feito pelo Serviço de Área de Trabalho Remota (Remote Desktop Services, RDS). Um computador executando o cliente RDS acessa pela rede o desktop do computador com o servidor RDS, os controles do teclado e mouse são transmitidos ao computador cliente e a imagem do desktop é exibida em uma janela no computador cliente. Nos computadores pessoais modernos, o ambiente de desktop é a interface gráfica do sistema operacional.

No Linux, a implementação de código aberto do servidor para o RDP é o xrdp (www.xrdp.org). As principais distros fornecem o pacote de instalação em seus repositórios. Um comando como "yum install xrdp" ou "apt-get install xrdp" resolve a instalação. O xrdp é baseado no FreeRDP (www.freerdp.com), uma implementação gratuita do RDP.

O arquivo de configuração do xrdp é o "/etc/xrdp/xrdp.ini". Seu conteúdo geralmente não precisa ser alterado, mas se for preciso é bem simples, como apresentado abaixo:

[globals]
bitmap_cache=yes
bitmap_compression=yes
port=3389
crypt_level=high
channel_code=1

[xrdp1]
name=sesman-Xvnc
lib=libvnc.so
username=ask
password=ask
ip=127.0.0.1
port=-1


A alteração que pode ser necessária é quanto a preferência do gerenciador de janelas. Para isso, edite o arquivo "/etc/xrdp/startwm.sh" e altere a linha SESSIONS, colocando em ordem de preferência o seu gerenciador de janelas:

SESSIONS="startkde gnome-session blackbox fluxbox startxfce4 xterm"

Outra necessidade é a definição do mapa de teclado. Ela é feita pelo arquivo "/etc/xrdp/km-xxxx.ini. O LCID para o português brasileiro é o número hexadecimal 0416. Então, verifique se existe o arquivo "/etc/xrdp/km-0416.ini". Se não existir, é preciso gerá-lo com a ferramenta xrdp-genkeymap, na linha de comando:

# xrdp-genkeymap /etc/xrdp/km-0416.ini

Observações: O xrdp-genkeymap se baseia no mapa configurado no servidor do X. Não importa o número que é dado para o arquivo km-xxxx.ini, o conteúdo gerado é proveniente das configurações do X. O meu xrdp curiosamente carrega e usa o mapa do arquivo km-0409.ini (en-us), mesmo com o X configurado para ABNT2 pt-br e inclusive existindo o arquivo km-0416.ini, então eu gerei o mapa sobrescrevendo este arquivo da língua inglesa (0409). A documentação do xrdp é muito pouca para esclarecer este quesito de mapa de teclado.

Provavelmente tudo está pronto para funcionar. Existem outros arquivos para configuração, scripts etc. mas só edita-se caso queira uma personalização maior, desta forma, é só iniciar o serviço do servidor xrdp para tornar ativo:

# service xrdp start

A máquina com o servidor do RDP está pronta para receber conexões de clientes de RDP. No Linux existe o cliente "rdesktop", na linha de comando. O artigo "Serviço de Área de Trabalho Remota do Windows" (http://dan-scientia.blogspot.com.br/2010/04/servico-de-area-de-trabalho-remota-do.html) mostra o serviço no sistema Windows e a linha de comando do rdesktop para tal conexão. Este serviço de RDP é bastante útil para manutenção de sistema pela rede.

quinta-feira, 7 de fevereiro de 2013

Problema de Lógica: Metade e Dobro

Qual é a metade do dobro do dobro da metade de um número?





RESPOSTA





Vamos adotar um número para facilitar o esclarecimento, no exemplo abaixo o número 6. Assim, do fim da frase para o início:

A metade de 6 é 3.
O dobro da metade de 6 é 6.
O dobro do dobro da metade de 6 é 12.
A metade do dobro do dobro da metade de 6 é 6.

Portanto, a metade do dobro do dobro da metade de um número é o próprio número.

quarta-feira, 30 de janeiro de 2013

Localizar um Android com o AndroidLost

Este artigo complementa o meu outro artigo "Como localizar um Android perdido" (http://dan-scientia.blogspot.com.br/2013/01/como-localizar-um-android-perdido.html) onde apresentei três aplicativos que localizam um smartphone perdido.

Encontrei um aplicativo que me impressionou pela simplicidade e por ter muitas funcionalidades. O AndroidLost (http://www.androidlost.com/), disponível gratuitamente na Google Play (https://play.google.com/store/apps/details?id=com.androidlost), é uma ferramenta provavelmente melhor do que as três apresentadas no artigo anterior, pois possui mais funcionalidades gratuitas. Mas muito mais funcionalidades.

Começando pelos comandos por SMS, o AndroidLost possui muitos comandos para serem executados caso o aparelho esteja sem conexão com a Internet, ele recebe o comando por SMS e também devolve a informação por SMS. Em seguida, possui uma interface web com também muitos comandos e recebimento das informações do aparelho. Se não for o bastante, algumas respostas podem vir por e-mail, para seu e-mail pessoal.

Os comandos, além dos de praxe que são receber a coordenada geográfica, mapa com a localização, bloqueio do aparelho, limpeza dos dados, disparo de alarme etc., é possível recuperar as mensagens SMS para o e-mail, enviar SMS do seu aparelho digitando-a na interface web, exibir mensagem popup na tela do aparelho, tirar foto com a câmera e enviar o arquivo para o seu e-mail, e até pronunciar uma frase pelo sintetizador de voz do aparelho (text-to-speech), redigida na interface web.

Após a instalação do aplicativo pela Google Play, a configuração do AndroidLost é extremamente simples. De início, basta executar o aplicativo que a configuração e a conexão com os servidores da Google se completam e pronto, já está configurado e ativo. Depois, faça o login na interface web do AndroidLost, usando a sua conta do Google, e autorize o aplicativo a usar a sua conta Google. O AndroidLost usa a sua conta do Google para autenticação e controle do aparelho. A única ação manual no processo de configuração, importante, é o ajuste no sistema Android para dar permissão de administrador ao aplicativo AndroidLost. Na execução do aplicativo, em sua tela inicial, é exibido um botão com a legenda "Request Administrator rights". Clique nele e a interface do sistema, para configuração da permissão, é aberta, basta aceitar. A permissão de administrador é requerida para o AndroidLost conseguir executar ações mais intrusivas no aparelho, como bloqueio, limpeza etc.

Vale a pena ter o AndroidLost no aparelho, é simples, é bastante funcional e é bem leve no consumo dos recursos do aparelho. Outro ponto positivo é o tempo no retorno dos comandos, pela interface web é quase instantâneo. Estou usando, em conjunto com os outros aplicativos de recuperação.