quinta-feira, 31 de dezembro de 2015

2016

Em soma de potências de 2: 210+29+28+27+26+2

Em binário: 11111100000

Em base 8: 3740

Em base 16: 7E0

Em base 32: 1V0

Em primos: 2 5 * 3 2 * 7

E o meu favorito: 2017-1.

quarta-feira, 23 de dezembro de 2015

Humanos e máquinas

Precisei consertar um Oracle Dataguard (um banco reserva que recebe todas as alterações do banco principal e que funciona como  cópia de segurança) e descobri algo sobre a produtividade dos seres humanos.

O banco reserva estava 17h atrás do banco principal quando resolvi o problema que impedia que o banco principal enviasse as alterações. Em 15 minutos os dois estavam sincronizados.

Isso quer dizer que os humanos levaram 17h para invocar transações suficientes para provocar 15 minutos de trabalho no banco secundário. Ademais, o banco primário funciona em duas máquinas, enquanto o secundário roda sobre apenas um servidor.

Evidentemente, o processamento usado em consultas não entra nessa conta. Por outro lado, muitas das alterações são provocadas por jobs (não precisam de interação humana). Mesmo assim, é interessante o fato de que um computador fez o trabalho de milhares de pessoas 68 vezes mais rapidamente.

quarta-feira, 19 de agosto de 2015

Linguagem de baixo nível

Foi numa conversa com uma usuária que percebi o quão inadequada era uma das palavras mais comuns do vocabulário da informática: salvar. Certamente, trata-se de um anglicismo e que funciona suficientemente bem no português. Mesmo considerando que os dados realmente precisam de salvação, já que podem desaparecer se faltar luz (salvo se o sistema usar memória de ferrite), é excessivamente dramática essa palavra. O verbo gravar (ou talvez guardar) seria mais adequado e menos teatral.

Mais recentemente, escutei uma conversa na qual um colega explica a uma usuária que uma rotina havia sido codificada em linguagem de baixo nível.

Fiquei a imaginar o que a pessoa leiga pensou. Que alguém levantou a voz e insultou a máquina? Que ela própria corria o risco de escutar poucas e boas? De qualquer forma, o assunto foi resolvido com brevidade e salvou-se o dia.

sexta-feira, 10 de julho de 2015

Somando linhas com awk

Eu queria saber quantos bytes (octetos para os de tendências latinas) foram buscados pelo Apache por um grupo de máquinas. Descobri um pequeno truque com awk:

awk '{s+=$1} END {print s}'

Esse código soma valores e imprime o resultado no fim. Posso adicionar um parâmetro com o nome de um arquivo, ou posso usá-lo com um pipe:

grep -P "10\.208\S+" access_log | grep -Po "\d+$" | awk '{s+=$1} END {print s}'

O primeiro grep filtra um faixa de IPs (todos os que começam com 10.208); o segundo pega o último valor da linha (que é o número de bytes transmitidos); por fim, o awk soma os valores.

quarta-feira, 27 de maio de 2015

Conversão de base sem ifs

Já perdi a conta do número de vezes que tive que enfrentar pequenas séries durante entrevistas de emprego. E sempre tive medo de que minha solução, mesmo sendo verdadeira, não fosse considerada pelo entrevistador.
Por exemplo, se um candidato fosse apresentado a "2,3,4", 82000 seria uma resposta perfeitamente razoável para o próximo elemento da série. Essa é a série de números que podem ser escritos usando apenas os dígitos 1 e 0 na enésima base e também em todas as anteriores.
Por exemplo, 4 na base 4 é 10, na base 3 é 11, na base 2 é 100.
O número 82000 até a base 5 tem as seguintes formas:
    • Em base 2 = 10100000001010000;
    • Em base 3 = 11011111001;
    • Em base 4 = 110001100;
    • Em base 5 = 10111000;
Por essas, nunca gostei desses exercícios como prova, embora os curta como diversão.
Em Perl, escrevi uma pequena função para converter para uma base até 32:

{
  use integer;
  my @digits=split(//,'0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ');
  sub to_base {
    my $n=shift;
    my $base=shift;
    if($n<$base) {
      return $digits[$n];
    } else {
      return to_base($n/$base, $base) . $digits[$n%$base];
    }
  }
 }
Para ir além da base 32, bastaria adicionar novos símbolos. De qualquer forma, achei que seria mais interessante retirar a recursão e também o if.

{
  my @digits=split(//,'0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ');
  sub to_base {
    my $n=shift;
    my $base=shift;
    join '', 
      reverse 
        map { $digits[int(($n%($base**($_+1)))/($base**$_))] }
          0..int(log($n)/log($base));
  }
}
A solução advém do fato de que podemos calcular qualquer dígito sem olhar os demais e que podemos calcular quantas casas serão necessárias para uma determinada base (com log(n)/log(b), sendo n o número e b a base).

Então, temos dígitos até log(n)/log(b): de b0 até blog(n)/log(b). Para saber o valor de um dígito, tiramos o resto da divisão de n por b na potência da casa subsequente (eliminando assim, todos os dígitos à esquerda). Depois dividimos por b na potência da respectiva casa e eliminamos a parte fracionária (eliminando assim, os dígitos à direita).

A função log(), vale lembrar, produz o logaritmo natural.

Por exemplo, 167 em base 10, requer log(167)/log(10)+1 dígitos (2,222+1=3). O valor dos dígitos em base 10, obtemos assim:
  1. 167 mod 1000 = 167 => 167/100 = 1;
  2. 167 mod 100 = 67 => 67/10 = 6;
  3. 167 mod 10 = 7 => 7/1 = 7.
E para base 8:
  1. 167 mod 512 (8*8*8) = 167 => 167/64 (8*8) = 2;
  2. 167 mod 64 = 39 => 39/8 = 4;
  3. 167 mod 8 = 7 => 7/1 = 7.
Mais um triunfo para a programação ifless.

quarta-feira, 20 de maio de 2015

30 anos do MSX Hotbit

Em novembro de 1985, foi lançado o Hotbit. Em dezembro, a Mesbla o vendia por Cr$3.900.000,00. Quase quatro milhões de cruzeiros. Como o dólar estava quotado a Cr$10 mil, seriam apenas US$400,00. Atualizados para 2015, seriam US$877,77.

Em 1985 foi lançado o Amiga 1000. Era uma máquina de 16 bits muito superior, mas o preço também era muito superior: US$1.295,00. De qualquer forma, os micros de 8 bits já estavam de saída quando o MSX foi lançado no Brasil.

Mesmo assim, eram máquinas com bastante potencial e a baixa penetração da informática no Brasil naquela época impediu que fossem usados como deveriam. O Reino Unido, nessa mesma década, colocou micros de 8 bits em todas as escolas primárias e secundárias.

Havia periféricos que permitiriam o Hotbit operar como uma máquina de negócios, leitor de disquetes sendo a expansão mais óbvia. Também havia expansão de memória, cartão para exibição de 80 colunas, e modem. Um Hotbit poderia, segundo a especificação, suportar até 512KB de RAM. Ou seja, era um computador realmente útil.

É uma pena que discutiu-se tanto a defasagem tecnológica gerada pela reserva de mercado, enquanto pouco se discutiu como usar a tecnologia disponível da forma mais produtiva possível. Ou de como baratear a tecnologia para que mais pessoas pudessem usá-la.

quinta-feira, 12 de fevereiro de 2015

A China e eu

Quando comecei a comprar produtos da China, o fiz com muito receio. Abri uma conta no Paypal e a uso para todos os pagamentos. Assim, espero proteger meu cartão de crédito.

Inicialmente, eu esperava chegar um produto para encomendar outro. Mesmo comprando apenas produtos de pequeno valor (cabos, adaptadores, LEDs, etc), eu queria restringir minhas perdas se algo desse errado. Os produtos demoram muito a chegar, então isso era um pouco frustrante.

Logo descobri que a verdadeira causa das demoras são os correios brasileiros. Os chineses entregam os produtos no Brasil em duas ou três semanas. Depois, eles guardam pó num depósito do correio por até 5 meses (a maior espera até agora).

Comprei uns produtos de uma loja inglesa e descobri que os ingleses entregam os produtos no Brasil em menos de uma semana (de três a cinco dias). Aqui, eles cumprem quarentena nos correios, embora seja mais curta que a dos produtos chineses.

Agora, tenho plena confiança nos chineses. Nunca falharam.

Então, recentemente, resolvi comprar um HD para fazer backups de arquivos importantes. Resolvi comprar um Hitachi de 1TB da loja Balão da Informática. Os HDs dessa marca têm a fama de serem muito confiáveis. Entretanto, recebi um HD cujo SMART indicava 39.397 horas de uso. Ele havia sido fabricado em 2008, então o valor tinha sentido. O HD foi importado por uma empresa chamada DEXCOM. Uma busca rápida revela que mais gente já recebeu um desses discos; devem ter sido comprados de algum datacenter, já no final de suas vidas úteis.

Retornei o aparelho e obtive estorno, sem grandes atribulações. Mesmo assim, resolvi evitar a combinação Hitachi/Balão da Informática/Dexcom.

Resolvi comprar um HD no Walmart.com. Escolhi um WD Caviar de 2TB. Um pouco mais caro, mas com mais espaço e sem possibilidade de ser (muito) usado. O aparelho que recebi não funciona. Ele está tão danificado que não consigo passar da BIOS no boot. Testei em 3 máquinas e o resultado é sempre o mesmo. Instalando num dock externo, consegui obter pelo SMART apenas a identificação do aparelho.

Em resumo, compro da China, porque confio neles. Surpreendente isso.


sexta-feira, 23 de janeiro de 2015

Um ano suspeito

O ano de 2015 é curioso por esse ser um número de Lucas-Carmichael. Isso significa que se somarmos um a cada um de seus fatores primos, teremos fatores de 2016.

Isto é, 2015=5*13*31 e 6, 14 e 32 dividem 2016.

Além disso, 6*14*32=2688 e 2688-2015=673.

O número 673 é um primo especial e suspeito, porque a pirâmide do Louvre possui 673 painéis. Não bastasse isso, em 2015 Leonardo da Vinci teria 563 anos e este também é um número primo.

A divisão de 2016 por 6, 14, e 32 produz 336, 114, e 63. Cada um desses anos foi importante na história da Armênia.
  • 336 AC - Orontes II ascende ao trono;
  • 63 - Os romanos invadem a Armênia e o rei Tiriades submete-se ao Império;
  • 114 - O imperador Trajano invade a Armênia;
  • 336 - A capital passa para a cidade de Dvin, construída por Cosroes III.
Ademais, Leonardo da Vinci esteve viajando entre 1483 e 1487 (ambos números primos) e esteve na Armênia em 1487.

E a Última Ceia foi pintada depois disso...