sábado, 24 de fevereiro de 2024

O que o IBM PC já fez por nós?

O primeiro PC da IBM (modelo 5150) foi lançado no fim de 1981. A revista Byte o avaliou no início de 1982. Comparados aos micros de 8 bits, ele não tinha muito a oferecer.

Temos que considerar que memória era muito cara nessa época. 64KB de RAM custavam centenas de dólares. Então, não é surpreendente que o modelo básico tivesse apenas 16KB. A placa mãe poderia ser expandida até 64KB e depois disso, a máquina poderia ser levada até 256KB via uma placa num dos 5 slots.

5 slots até parecem bastantes, porque os micros de 8 bits em geral não tinham nenhum. Por outro lado, um deles já tinha que ser ocupado pela placa de vídeo. Então, eram 4 slots livres, na melhor das hipóteses. Instalar um drive de disquetes implicava instalar uma placa noutro slot.

O processador 8088 não era muito melhor que um Z80 ou um 6502. Apesar das CPUs de 8 bits só suportarem apenas 64KB de RAM, pouca gente tinha orçamento para mais que isso mesmo.

A configuração original não tinha drives de disquetes. Estes também eram muito caros nessa época, custando de US$300 até U$600. Então, o PC original, assim como os micros de 8 bits, tinha uma interface para fita cassete.

E também como os micros de 8 bits, o 5150 tinha um BASIC em ROM. Apenas uma vez testemunhei um PC com BASIC em ROM. Se o sistema não encontrasse um disco com sistema operacional, ele caía no BASIC. Era um BASIC da Microsoft. Até agora, o PC original não se distingue em nada dos micros de 8 bits, tanto que o BASIC era mais lento que um BASIC num Z80 a 4Mhz e muito mais lento que o BBC Basic rodando a 2MHz num 6502.

Duas características importantes eram evidentes: um teclado de qualidade (que poucos micros de 8 bits tinham) e 80 colunas já na configuração mais básica.

O preço de um PC completo, com drive de disquetes, 64KB de RAM e vídeo com 80 colunas, era muito parecido ao de um Apple II Plus com as mesmas características (~US$2.700).

Pode-se argumentar que o BBC B, lançado em dezembro de 1981 era melhor e até um pouco mais barato, mas ele estava restrito a 32KB de RAM e versões com 64KB ou mais só surgiram em 1985 (placas de expansão de memória eram oferecidas antes desse ano).

Em 1982, uma libra comprava ~US$1,66 e um BBC B, com monitor colorido, e um drive de disquetes custava cerca de £900, ou uns US$1500. Era um bom negócio, desde que se estivesse do lado certo do Atlântico. O BBC B já vinha de fábrica com suporte a 80 colunas e também tinha um modo texto (40x25) muito prático que só consumia 1KB da memória.

As comparações de memória RAM costumam esquecer que o PC precisava carregar o DOS na RAM, enquanto em micros de 8 bits a ROM podia habitar um espaço de endereços diferente da RAM. Mas vamos ignorar isso, porque cada máquina tinha uma arquitetura diferente.

O som do PC era pífio: apenas um canal que emitia uns ruídos irritantes.

Então o que tornava o PC 5150 interessante? Temos que pensar como um comprador comercial, não como um adolescente ávido por jogos. O PC oferecia as facilidades importantes para trabalhar com produtividade, num pacote completo. A quantidade de cores e o som não eram importantes para esse comprador, mas as 80 colunas, o teclado de qualidade, a possibilidade de expansão fácil, e a possibilidade de ir até 256KB de RAM eram importantes. Os usuários comerciais estavam acostumados ao sistema operacional CP/M (parecido com DOS) e 80 colunas eram comuns nessa plataforma.

Ele também oferecia a segurança de que não haveria qualquer possibilidade do seu filho se interessar por ele e tomar como refém o micro da firma.

Naquele tempo, a IBM não publicava informações sobre produtos que não estivessem prontos para serem vendidos. Logo, ninguém sabia se haveria outros modelos mais adiante. Comparando friamente as características do PC original com alguns micros da época, não era uma escolha óbvia, embora tampouco fosse uma escolha ruim.

O que o PC de 1981 oferecia eram algumas características importantes para aplicações comerciais. O que o PC de hoje oferece é uma plataforma aberta com grande concorrência de fornecedores. Essa possibilidade não demorou muito a aparecer e, dados os preços da IBM, era inevitável.

A minha teoria é a de que o PC só se tornou a escolha técnica indiscutível (não vamos considerar tamanho do mercado ou outros fatores) quando apareceu o 386, em 1985 (as coisas andavam muito rapidamente nos anos 1980). O primeiro PC com 386 foi lançado em 1986 pela Compaq; a IBM em 5 anos já tinha perdido a liderança da plataforma que ela mesma tinha criado. Nesse ponto, não havia mais computador doméstico que oferecesse negócio melhor.

quinta-feira, 1 de fevereiro de 2024

Experimentos com Compressão de Textos

Inspirado num artigo no Hacker News, resolvi fazer uns experimentos com textos.

Baixei o livro Amor de Perdição (Camilo Castelo Branco) do Projeto Gutenberg. Dizem que minha avó lia escondida esta lasciva obra quando ainda andava de pés descalços pelos campos de Alquerubim.

O arquivo está codificado em UTF-8 e ocupa 310KB. Usarei números aproximados apenas.

O gzip reduz o arquivo a 121KB. Com minúsculas apenas, o gzip o reduz a 118KB. Miseros 3KB que representam uma pífia economia de 2,5%.

E se eu quiser guardar as maiúsculas para restaurar o arquivo? O problema é que só as maiúsculas ocupam quase 7KB.

Mesmo ante o fracasso iminente, prossegui com meu plano insensato e pouco elaborado: troquei todas as maiúsculas por traços baixos e coloquei todas as maísculas no início do arquivo. O plano era trocar um a um os traços baixos pelas letras do cabeçalho após a descompressão.

O resultado final comprimido ocupa 124KB. Logo, não há vantagem nenhuma nesse tipo de codificação.

Usar apenas uma caixa (alta ou baixa, tanto faz) realmente economiza espaço, embora não seja surpreendente. Encontrar uma maneira de restaurar o texto original é um pouco mais complicado.

Experimentei também colocar as maiúsculas no fim, mas como minúsculas; afinal, terei a certeza de que tudo o que estiver na última linha tem que ser caixa alta. O resultado supreendeu: 122KB compactados. O arquivo ficou apenas 1KB maior que o original compactado.

Talvez ainda haja algo a fazer com os espaços.

terça-feira, 30 de janeiro de 2024

Limpando o postgresql.conf

O Postgresql é relativamente simples de entender e configurar. Mesmo compilá-lo não é complicado.

Entretanto, o principal arquivo de configuração tem um excesso de documentação. Uma solução simples é guardar o arquivo original e limpar tudo o que não for essencial.

O que precisamos limpar são todas as linhas que começam com # ou estão em branco.


 cp postgresql.conf postgresql.conf.original
 grep -Pv "^\s*#" postgresql.conf | grep "\S" > postgresql.conf


O primeiro grep elimina todas as linhas que começam com um # e que talvez tenham espaços antes desse caracter. O segundo limpa todas as linhas em branco.

No meu caso, um arquivo com 979 linhas ficou reduzido a 18.

sexta-feira, 26 de janeiro de 2024

Grep com Contexto

O grep geralmente é usado em arquivos orientados a linhas. De quando em vez aparece algo mais complicado.

Se precisamos de mais contexto, podemos usar -B (before) e -A (after) para indicar quantas linhas queremos de antes e depois do que for encontrado:


  grep -B 4 -A 3 ERROR log.txt
  

E assim podemos ver 3 linhas para frente e 4 para trás.

Se o arquivo tiver delimitadores, podemos usar uma mágica do Perl. Considere o arquivo abaixo:


Registro 1
Nome: Fulano
Endereço: Rua Torta, 1
Sexo: M
Fim
Registro 2
Nome: Beltrana
Endereço: Rua Reta, 12
Sexo: F
Fim

Se eu quiser filtrar todos os registros com "Sexo: F", posso usar a variável $/, que indica o que é um separador de linha.


$ perl -ne "BEGIN{$/='Fim'} print if /Sexo: F/" pessoas.txt

Registro 2
Nome: Beltrana
Endereço: Rua Reta, 12
Sexo: F
$ perl -ne "BEGIN{$/='Fim'} print if /Sexo: M/" pessoas.txt
Registro 1
Nome: Fulano
Endereço: Rua Torta, 1
Sexo: M

O BEGIN serve para executarmos a atribuição apenas uma vez, porque a opção -n coloca tudo dentro de um "while(<>) {}". Mas se não nos importamos com isso, podemos simplificar com:


 perl -ne "$/='Fim'; print if /Sexo: M/" pessoas.txt
 

Podemos até incluir o \n no valor de $/ para não surgirem linhas vazias nos resultados. Para isso, também temos usar o qq() (quoted string) para não termos problemas com as aspas duplas:


 perl -ne "$/=qq(Fim\n); print if /Sexo: M/" pessoas.txt
 

Se os registros não tiverem os mesmos terminadores ou se o arquivo contiver outras estruturas que não nos interessam, podemos usar o operador flip-flop:


#!/usr/bin/perl
open(my $file, '<', $ARGV[0]);

my ($block, $found);
while(<$file>) {
    if(/^Registro/ .. /^Fim/) {
        $found=1 if /Sexo: M/;
        $block.=$_;
    } else {
        print $block if $found;
        undef $block;
        $found=0;
    }
}
print $block if $found;
  

Esse script recebe o nome do arquivo como parâmetro. A mágica acontece no "if(/^Registro/ .. /^Fim/)". O operador começa a retornar verdadeiro quando encontra Registro e passa a retornar falso quando encontra Fim. O resto do arquivo cai no else. O resto do script é óbvio.

Então, temos 3 opções para buscas progressivamente complexas em arquivos. Perl, como de costume, salva o dia.

segunda-feira, 22 de janeiro de 2024

Complicando o Problema dos Pintores

Um pintor pinta um quarto em 3h e o outro completa o serviço em 5h. Quanto tempo os dois juntos levam para pintar o quarto?

A gente poderia calcular o progresso por unidade de tempo, mas é melhor trabalhar com inteiros até onde der. Então, precisamos de um valor que os dois dividam. O mais óbvio é 3*5=15

Nesse tempo, o primeiro pinta 5 quartos (15/3) e o segundo pinta 3 quartos. Portanto, o tempo para os dois juntos pintarem um quarto será 15/(3+5): um pouco menos de 2h.

Os números 3 e 5 são primos, então o MMC deles só pode ser 3*5. Se os tempos forem 4 e 8, podemos usar 8 e a conta será 8/(1+0,5) ou 16/3.

Se usarmos 4 e 6, o MMC será 12 e a conta será 12/(3+2)=12/5.

O legal desse problema é que podemos usar qualquer quantidade de pintores. Se tivermos dois pintores lentos que levam 5h e um apressadinho que leva 3, a conta será 15/(5+3+3)=15/11.

Qual terá sido a contribuição de cada um?

Para calcular a contribução de cada um, basta multiplicar o recíproco do tempo de cada pintor pelo tempo total do serviço. Então, nosso amigo que leva 3h, terá contribuído com 15/8 * 1/3 = 15/24. O colega folgado contribuirá com 15/8*5 = 15/40. Com base nisso, podemos dividir o pagamento.

O MMC de 24 e 40 é 120 e então podemos confirmar que 15*5 + 15*3 = 120 e a nossa conta fecha 100%.

A conta fecha também com os três pintores: (15/(13*5))+(15/(13*3))+(15/(13*3))=5/13+3/13+3/13=1.

Se usarmos 3, 5, e 7, o produto será 105 e a soma 71 (105/3 + 105/5 + 105/7). É preciso ter cuidado para não esquecer que a soma é das divisões dos produtos por cada tempo, não os tempos em si.

Outra forma de ver a conta, é que é a soma dos produtos 2 a 2 (no caso de termos 3 pintores. Ou seja: 3*5 + 3*7 + 5*7.

Claro que só posso pensar numa solução n a n se o nominador for o produto de todos os tempos. Por exemplo, com os tempos 3, 5, e 5, seria preciso usar 3*5*5 para então calcular o denominador com 3*5 + 3*5 + 5*5. Note que 75/55=15/11. Usar o 15 seria um equivoco. Então o mais fácil é não misturar a combinatórica com o MMC. Use um ou outro, conforme o gosto pessoal.

Acho que basta deste assunto. Os pintores nunca vêm no horário combinado mesmo.

quinta-feira, 4 de janeiro de 2024

Niklaus Wirth (1934-2024)

O ano de 2024 começou com o falecimento do pai do Pascal, Niklaus Wirth.

Pascal foi a minha segunda linguagem de programação, depois do BASIC. Primeiro, tive que sofrer um pouco por não ter linhas numeradas; uma vez superada essa barreira, sofri um com ponteiros.

A linguagem, entretanto, ensinou-me bons hábitos e o esforço valeu a pena.

O ambiente em que eu aprendi a usar o Pascal merece uma nota: ISO Pascal da Acornsoft.

Para entender esse ambiente, é preciso entender um pouco sobre a máquina no qual ele rodava: o BBC Micro da Acorn.

Esse micro usava um 6502 e, portanto, só podia endereçar 64KB. Para contornar essa limitação, ele alternava um bloco de 16KB dentre os ROMs disponíveis. Esses ROMs podiam conter linguagens ou simplemente comandos para o Sistema Operacional; quando um comando era digitado na linha de comando, o SO procurava o código nos ROMs instalados. Havia também ROMs para Lisp, Forth, BCPL, Prolog, Logo, e COMAL.

Dentre os ROMs podia haver também chips de RAM! No caso do meu micro, havia 4x16KB. Essa memória podia se comportar como ROMs comuns (era possível carregar uma imagem de ROM a partir de um disquete, por exemplo), ou o programador podia usar como bem entendesse, uma vez que bastava colocar um valor num certo endereço de memória para trocar o ROM ou RAM visível para a CPU.

Havia mais algumas complicações, como 20KB de Shadow Memory que ficavam "atrás" da memória de vídeo e que podiam ser usadas para gráficos, desde que o programador usasse apenas as rotinas do SO. Havia também mais 12KB que o SO usava para não roubar mais RAM do usuário.

O Pascal vinha em 2 ROMs: um para o compilador e outro para o editor, as bibliotecas, e o interpretador de BL-code (um tipo de p-code). Esse BL-code foi inventado para contornar as limitações da máquina: simplesmente compilar para código de máquina era inviável, porque os binários ficariam muito grandes.

Como o compilador também estava em BL-code, para poder compilar um programa, o interpretador se copiava para a memória principal. Para rodar um programa já compilado, o interpretador podia ficar na área de ROM.

O editor ocupava apenas 4KB, mas tinha pesquisa com expressões regulares. É difícil acreditar nisso hoje em dia. Ele rodava no modo texto (40x25) e, portanto, gastava apenas 1KB de memória de vídeo. Os programas, entretanto, podiam ser rodados em qualquer modo.

Este foi o primeiro Pascal fiel à norma que rodou numa máquina sem disco. Ele recebeu elogios até da Primeira Ministra Margaret Thatcher; não que ela entendesse exatamente o que estava elogiando, mas elogiou.

A caixa incluía, além do software em ROM, um disquete (dava para rodar com disquete também), um manual, um cartão de referência, e um excelente livro entitulado: Pascal from BASIC. Afinal, os autores conheciam bem seu público.

E com essas boas lembranças, nos despedimos do grande Niklaus Wirth.

quinta-feira, 28 de dezembro de 2023

Minha Teoria de Tudo

Eu imagino que todo mundo conheça algum senhor de uma certa idade que tenha uma "teoria de tudo". Penso isso, porque já conheci várias figuras assim. Geralmente são aposentados e conseguem reduzir todos os problemas do mundo ao excesso de gente, ou à falta de polícia, ou ao comunismo, etc.

Ainda estou longe de me aposentar, tão longe que eu acho que sequer vou chegar lá: um dia, eu digo aos meus colegas, vou deixar de vir ao trabalho. Entretanto, já começa a se formar na minha cabeça uma teoria de tudo.

Durante a pandemia, comecei a assistir muitos vídeos sobre filosofia. Em parte por interesse no assunto, em parte porque Kant me ajudava a dormir. Um fato curioso começou a se desenhar: há muitos canais de filosofia apresentados por pessoas trans ou drag-queens. Pode ser também que o Youtube tenha decidido que, de todos os canais de filosofia, eu prefira esses.

O último que apareceu para mim é o Philosophy Tube, apresentado por uma Abigail Thorn. E o episódio que surgiu para mim era sobre construções sociais. É uma apresentação bastante convincente sobre a aribtrariedade das normas da sociedade. Naturalmente, uma pessoa que viva fora das convenções, como Abigail Thorn, deve perceber com maior claridade as limitações dessas normas.

Concorrentemente, estou lendo um livro sobre autismo (Unmasking Autism - Devon Price), mais especificamente sobre mascaramento. Logo na introdução há uma referência a Hannah Gadbsy, uma comediante autista e que, num de seus esquetes, fala sobre sua dificuldade na escola. A dificuldade, naturalmente, advém da incapacidade de pensar na mesma frequência que a professora.

Essa força em direção ao conformismo que vivenciamos na sociedade, sendo causa ou consequência, não sei bem ainda, age no sentido de manter o status quo.

As religiões costumam ter um credo; o catolicismo obriga as pessoas a repetir o credo em todas as missas (pelo menos todas a que eu fui). É um momento estranho: se eu acredito mesmo nisso, por que tenho que ficar repetindo? Não acordo todo dia e repito: a terra é redonda, orbita o sol, e as espécies evoluem através da seleção natural.

Tem um trecho da quinta sinfonia de Shostakovich que ele descreve como:

É como se alguém estivesse batendo em você com um pedaço de pau e dizendo: “Seu negócio é alegria, seu negócio é alegria”, e você se levanta, trêmulo, e sai marchando, murmurando: “Nosso negócio é alegria, nosso negócio é alegria”.

O problema, como eu o vejo, é que muita gente sai mesmo marchando com alegria. A superestrutura dá um tapa na cara do sujeito e ele ainda não a enxerga.

Esses defeitos na matriz aparecem em outros lugares, não apenas na religião. Aparecem na insistência da mídia corporativa com os ideais neoliberais; aparecem em cartazes com "Eu confio na Polícia"; e até nas renovações anuais dos "valores" das empresas. Essas coisas lembram os cartazes ufanistas dos países comunistas: Glória ao Povo Soviético Rumo ao Comunismo! Pelo menos a arte era melhor e tinham mosaicos.

O que terão de especial as drag-queens e os autistas? Os primeiros sofrem por não se adequarem às normas, os segundos por não entenderem as normas.

Mas, se as construções sociais são arbitrárias, podemos imaginar um mundo em que os autistas e as drag-queens sejam os heróis da sociedade: eles percebem o que é supérfluo! Deficientes são aqueles que acreditam nas arbitrariedades da sociedade como se fossem uma lei natural e acreditam com tal força que acham-se no direito até de usar de violência física, verbal, ou qual seja, para reafirmar suas crenças.

Quem é deficiente ou não é também uma construção social.

E então chego a meu diagnóstico que tudo abrange: o problema da sociedade é que deixamos as pessoas deficientes organizarem tudo.