tag:blogger.com,1999:blog-1097150041227041082024-03-28T07:15:58.002-07:00AlquerubimDesobediência tecnológicaforintihttp://www.blogger.com/profile/17068327084336710677noreply@blogger.comBlogger318125tag:blogger.com,1999:blog-109715004122704108.post-25983395512945669902024-02-24T02:28:00.000-08:002024-02-26T03:56:50.768-08:00O 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 forintihttp://www.blogger.com/profile/17068327084336710677noreply@blogger.com0tag:blogger.com,1999:blog-109715004122704108.post-85804430836362381352024-02-01T05:16:00.000-08:002024-02-01T08:10:44.146-08:00Experimentos com Compressão de TextosInspirado 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 forintihttp://www.blogger.com/profile/17068327084336710677noreply@blogger.com0tag:blogger.com,1999:blog-109715004122704108.post-18850650369138701392024-01-30T05:21:00.000-08:002024-01-30T05:32:25.310-08:00Limpando o postgresql.confO 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
grepforintihttp://www.blogger.com/profile/17068327084336710677noreply@blogger.com0tag:blogger.com,1999:blog-109715004122704108.post-76992758781663787382024-01-26T10:33:00.000-08:002024-01-29T04:10:24.967-08:00Grep com ContextoO 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 forintihttp://www.blogger.com/profile/17068327084336710677noreply@blogger.com0tag:blogger.com,1999:blog-109715004122704108.post-5989217874627324232024-01-22T10:24:00.000-08:002024-02-28T06:56:06.681-08:00Complicando o Problema dos PintoresUm 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 tempoforintihttp://www.blogger.com/profile/17068327084336710677noreply@blogger.com0tag:blogger.com,1999:blog-109715004122704108.post-41001766125013731162024-01-04T13:41:00.000-08:002024-01-05T15:19:40.282-08:00Niklaus 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 notaforintihttp://www.blogger.com/profile/17068327084336710677noreply@blogger.com0tag:blogger.com,1999:blog-109715004122704108.post-12543267104505026432023-12-28T07:06:00.000-08:002023-12-29T03:58:07.874-08:00Minha Teoria de TudoEu 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 forintihttp://www.blogger.com/profile/17068327084336710677noreply@blogger.com0tag:blogger.com,1999:blog-109715004122704108.post-61201182021112502242023-11-11T03:34:00.001-08:002023-11-11T09:15:52.068-08:00PresensocialO escritório está a 5km de minha casa, mas entre levar as crianças ao colégio e dar carona à esposa, levo pelo menos uma hora para chegar lá. O trajeto todo tem uns 15km, então a velocidade média é de 15km/h. Péssimo.
Chego ao escritório cedo para ter tempo de verificar a situação antes que as interrupções iniciem. Dá tempo para resolver alguns chamados e talvez até corrigir um bug. Meia hora forintihttp://www.blogger.com/profile/17068327084336710677noreply@blogger.com1tag:blogger.com,1999:blog-109715004122704108.post-90210713697949324342023-10-31T05:10:00.003-07:002023-10-31T05:59:00.714-07:00Fizzbuzz com closuresDado que a solução com recursão tinha duas funções bem parecidas, o natural é subir um nível na abstração e criar uma função para criar funções.
#!/usr/bin/perl
use strict;
use warnings;
no warnings 'recursion';
sub make_fizzbuzz {
my ($callback, $factor, $word)=@_;
return sub {
my $n=shift || 1;
my $multiple=shift || 0;
if($n % $factor == 0) {
print $word;
$forintihttp://www.blogger.com/profile/17068327084336710677noreply@blogger.com0tag:blogger.com,1999:blog-109715004122704108.post-83379604982266618422023-10-30T05:40:00.003-07:002023-10-31T05:11:08.246-07:00Fizzbuzz recursivoUma construção interessante que não cheguei a usar profissionalmente é a recursão mútua: A() chama B() que chama A() e assim por diante.
Entretanto, pesquisando uma solução recursiva para o Fizzbuzz, ocorreu-me uma estrutura com 3 funções em uma recursão circular. Não tem esse nome no Google, mas parece uma maneira natural de descrever o código que segue.
Teremos uma função para os múltiplos de 3forintihttp://www.blogger.com/profile/17068327084336710677noreply@blogger.com0tag:blogger.com,1999:blog-109715004122704108.post-52491143233965593882023-10-10T07:09:00.009-07:002023-10-10T14:31:59.185-07:00FizzBuzz genéricoO FizzBuzz deveria ser um exercício de lógica, mas é muito mais divertido como um exercício de matemática.
No post anterior, vimos como os valores podem ser mapeados facilmente usando n4 mod 15.
Esse expoente é o MMC dos valores das totientes de 3 e 5 (que chamarei de chaves). A função totiente conta todos os números inferiores a n que não possuem fatores comuns com n.
O 15 é o produto de 3 e 5. forintihttp://www.blogger.com/profile/17068327084336710677noreply@blogger.com0tag:blogger.com,1999:blog-109715004122704108.post-86838175381136208212023-10-06T07:39:00.005-07:002023-10-06T10:02:49.783-07:00FizzBuzz sem ifsUma questão que supostamente aparece em entrevistas para cargos de programação é o FizzBuzz. O enunciado é simples: imprima todos os números de 1 a n, mas imprima fizz para os múltiplos de 3, buzz para os múltiplos de 5, e fizzbuzz para os múltiplos de 3 e 5.
Sabemos que 3 e 5 são relativamente primos, então eles só vão juntos dividir n a cada 15 valores.
Um solução óbvia, então, é usar um forintihttp://www.blogger.com/profile/17068327084336710677noreply@blogger.com0tag:blogger.com,1999:blog-109715004122704108.post-18992623376766470412023-10-04T08:40:00.002-07:002023-10-05T06:06:05.932-07:00Novas placas de carrosCerta vez, um motorista de Uber apontou para mim que as placas novas não permitiam identificar se certos símbolos eram número ou letra. Eu tentei argumentar, explicando que em cada posição só podia haver um número ou uma letra. Infelizmente, o compatriota não alcançou a captar a minha explicação. A derrota foi mútua.
De qualquer forma, tenho notado que algumas placas são perigosamente parecidas aforintihttp://www.blogger.com/profile/17068327084336710677noreply@blogger.com0tag:blogger.com,1999:blog-109715004122704108.post-5078901912894954362023-09-28T08:12:00.006-07:002023-09-28T11:06:20.708-07:00A era do conteúdoUltimamente eu estive avaliando notebooks e comecei a assistir vídeos no Youtube. Infelizmente, todos são muito superficiais. Eles falam sobre as cores, se o micro é fininho ou não, quanto pesa, etc. A parte mais técnica é a enumeração das características básicas (CPU, memória, etc). Essa fixação com a espessura dos notebooks, por sinal, é de lascar, porque está levando a produtos que são forintihttp://www.blogger.com/profile/17068327084336710677noreply@blogger.com4tag:blogger.com,1999:blog-109715004122704108.post-28504399029784160312023-09-22T08:42:00.004-07:002023-09-24T14:01:29.110-07:00Ninguém pode visitar duas vezes o mesmo paísDurante minha juventude, nos anos 1980 e 1990, eu visitava o Uruguai com frequência, porque lá viviam meus avós. A casa dos abuelos oferecia uma pequena viagem no tempo: tinha muitos objetos dos anos 1950 e 1960; talvez até de antes.
Eu gostava de folhear revistas antigas, usar uma TV a válvula (que levava 3 horas para esquentar), ou brincar com o radinho portátil Spica (com capa de couro).
O forintihttp://www.blogger.com/profile/17068327084336710677noreply@blogger.com0tag:blogger.com,1999:blog-109715004122704108.post-40678262569673013402023-08-31T09:15:00.002-07:002023-08-31T09:15:11.249-07:00Como identificar linhas repetidas num CSVUma carga de arquivo CSV estava com problema, então resolvi usar um pouco de Perl para resolver o problema. O Perl adapta-se muito bem ao uso na linha de comando em conjunto com outros programas do Linux.A minha missão era descobrir linhas duplicadas num arquivo específico. As 6 primeiras colunas constituem a chave primária, então bastaria encontrar os valores repetidos sem olhar as demais forintihttp://www.blogger.com/profile/17068327084336710677noreply@blogger.com0tag:blogger.com,1999:blog-109715004122704108.post-87425768548769689132023-04-09T08:33:00.003-07:002023-04-10T02:49:44.548-07:00Entex Pacman2Eu tinha guardado num armário um jogo de Pacman produzido pela Entex nos anos 80. Resvolvi comprar umas pilhas para novamente dar vida ao brinquedo. Aparentemente, pilhas C não são tão populares como outrora, mas ainda dá para encontrá-las em mercados.Ele funciona em 3 modos: 1 jogador, 2 jogadores, e demonstração. O modo de 1 jogador é o jogo tradicional; no modo de dois jogadores, um dos forintihttp://www.blogger.com/profile/17068327084336710677noreply@blogger.com0tag:blogger.com,1999:blog-109715004122704108.post-59560972907831410412023-02-16T09:26:00.002-08:002023-02-16T09:27:49.447-08:00O Perl, O ChatGPT
Oh Perl! The language of codes obscure,
That poets and coders alike adore,
With symbols and syntax so complex,
A labyrinth of expressions to perplex.
The strings and arrays, the hashes and more,
In Perl they come to life with great uproar,
A language so powerful and so vast,
It can conquer any task, first or last.
Perl, the magic of regex at hand,
A tool for the skilled toforintihttp://www.blogger.com/profile/17068327084336710677noreply@blogger.com0tag:blogger.com,1999:blog-109715004122704108.post-73408497038601850612022-12-23T04:50:00.003-08:002022-12-23T07:25:11.240-08:00Solução para Copa do Mundo com 48 SeleçõesA Copa do Mundo de 2026 terá 48 times. A proposta inicial é de haver 16 grupos de 3, sendo que 2 de cada grupo se classificariam para a fase de dezesseis avos de final.
Infelizmente, essa combinação abre a possibilidade de conchavo entre times no último jogo.
Então, resolvi analisar o problema e creio ter encontrado uma solução bastante razoável. As premissas são:
O número de jogos que forintihttp://www.blogger.com/profile/17068327084336710677noreply@blogger.com0tag:blogger.com,1999:blog-109715004122704108.post-74248037723963729402022-11-29T06:05:00.006-08:002022-12-17T16:12:07.858-08:00Possíveis Combinações de Pontos nos Grupos da Copa do MundoA primeira fase das finais da copa do mundo tem grupos de 4 times; a vitória dá 3 pontos, o empate 1, e a derrota nenhum ponto.
Então, cada jogo tem 3 possibilidades e são 6 jogos entre os times A, B, C, e D:
AxB
AxC
AxD
BxC
BxD
DxC
Então, para contar todas as variações de resultados, contamos em base 3 de 000000 até 222222 (de 0 até 728); cada dígito nos diz se foi uma vitória forintihttp://www.blogger.com/profile/17068327084336710677noreply@blogger.com0tag:blogger.com,1999:blog-109715004122704108.post-4007716979478216372022-11-24T14:51:00.001-08:002022-11-24T14:51:46.268-08:00Como Calcular o Tamanho de um Diretório no LinuxComeçamos com o mais óbvio:
du -h
Mas não quero ver todo o caminho até o último diretório, então só mostro os primeiros:
du -h --max-depth=1
Mas o diretório é um share de uma máquina Windows e o du não retorna os tamanhos corretos das coisas:
find . -type f -exec stat -c "%s" {} \; \
| awk '{ sum += $1 } END { print sum }'
E se quero apenas somar os arquivos de um determinado tipo forintihttp://www.blogger.com/profile/17068327084336710677noreply@blogger.com0tag:blogger.com,1999:blog-109715004122704108.post-34659680438346096532022-11-07T03:53:00.004-08:002022-11-07T03:53:42.200-08:00Teorema Chinês dos Restos (com SQL)Lendo vários textos sobre o Teorema Chinês dos Restos, cheguei à conclusão que todas as explicações estão de ponta-cabeça. Então, resolvi atacar de uma maneira que eu pudesse entender.
Se pegarmos dois números p e q, primos entre si, sabemos que eles só vão se encontrar em p*q. Por exemplo, 5 e 8 só são ao mesmo tempo fatores de 40; 3, 4, e 5 só são ao mesmo tempo fatores de 3*4*5=60
Se eu forintihttp://www.blogger.com/profile/17068327084336710677noreply@blogger.com0tag:blogger.com,1999:blog-109715004122704108.post-65026133374653377432022-09-21T11:48:00.003-07:002022-09-23T05:32:18.586-07:00Regexp com Lookaround no GrepMuitas vezes encontrei-me concatenando greps para progressivamente encontrar dados e remover as partes redundantes. Algo assim:
grep -Po "\(\d+\)" arquivo.log | grep -Po "\d+"
O primeiro grep extrai números cercados por parênteses e o segundo extrai os parênteses e deixa apenas os dígitos.
Para evitar essa repetição, podemos lançar mão dos operadores de lookaround (lookahead e lookbehind).forintihttp://www.blogger.com/profile/17068327084336710677noreply@blogger.com0tag:blogger.com,1999:blog-109715004122704108.post-88622553373815339082022-08-16T05:58:00.002-07:002022-08-16T05:58:24.823-07:00Fatoração de FermatA soma dos números ímpares gera quadrados perfeitos: 1=1*1, 1+3=2*2, 1+3+5=3*3, 1+3+5+9=4*4, e assim por diante.Além
disso, todo número ímpar pode ser representado como a diferença entre
dois quadrados (embora nem todas as diferenças de quadrados resultem num
número ímpar).Então, 16-1=15 ou 9-4=5, ou 25-16=9.Fermat
usou essa propriedade para fatorar inteiros. Dado um inteiro N ímpar,
forintihttp://www.blogger.com/profile/17068327084336710677noreply@blogger.com0tag:blogger.com,1999:blog-109715004122704108.post-74204925324306341072022-07-15T15:49:00.016-07:002022-07-15T16:20:47.927-07:00Resíduos QuadráticosO resto da divisão de um quadrado por 100 só pode ter um de 22 valores distintos: {00,01,04,09,16,25,36,49,64,81,21,24,29,41,44,56,61,69,76,84,89,96} Isto acelera os testes feitos manualmente. Mas a base 100 só é realmente melhor para os humanos.Uma verificação rápida das bases até 256, revela que algumas têm porcentagens menores de resíduos quadráticos:80=>12 (15%)96=>14 (14%)112forintihttp://www.blogger.com/profile/17068327084336710677noreply@blogger.com0