Postagens

Postagem em destaque

Huguinho e Zezinho surfando com granizo

Imagem
Certa vez, em outubro de 2023, Huguinho e seu amigo Zezinho foram surfar no final da tarde. O vento estava forte e a chuva, constante. Quando chegaram perto da praia, mal conseguiam segurar suas pranchas. O mar estava bem mexido, e ainda tiveram que andar cerca de 1 km até o pico. Quando estavam se aproximando, começou a cair granizo! Dava para ouvir claramente o barulho das pedras contra as pranchas. Eles se abrigaram embaixo do posto avançado dos salva-vidas, mas não adiantou muito. Ficaram olhando o mar — que estava bem agitado e quebrando bem longe — e perceberam que estava difícil passar a arrebentação. Como o granizo não parava, decidiram entrar assim mesmo. Logo que entraram no mar, o granizo cessou, mas aí começou o verdadeiro desafio: passar a arrebentação. Depois de levar várias séries na cabeça e quase sem forças, finalmente conseguiram. E começaram os raios! Quando estavam quase decidindo sair por causa deles, os raios pararam. Ufa! É algo estranho: você está lá, só você (c...

Huguinho e Zezinho surfando com granizo

Imagem
Certa vez, em outubro de 2023, Huguinho e seu amigo Zezinho foram surfar no final da tarde. O vento estava forte e a chuva, constante. Quando chegaram perto da praia, mal conseguiam segurar suas pranchas. O mar estava bem mexido, e ainda tiveram que andar cerca de 1 km até o pico. Quando estavam se aproximando, começou a cair granizo! Dava para ouvir claramente o barulho das pedras contra as pranchas. Eles se abrigaram embaixo do posto avançado dos salva-vidas, mas não adiantou muito. Ficaram olhando o mar — que estava bem agitado e quebrando bem longe — e perceberam que estava difícil passar a arrebentação. Como o granizo não parava, decidiram entrar assim mesmo. Logo que entraram no mar, o granizo cessou, mas aí começou o verdadeiro desafio: passar a arrebentação. Depois de levar várias séries na cabeça e quase sem forças, finalmente conseguiram. E começaram os raios! Quando estavam quase decidindo sair por causa deles, os raios pararam. Ufa! É algo estranho: você está lá, só você (c...

Assinando arquivos PDF com certificado digital em Go

Imagem
Desenvolver uma solução para assinar PDFs com certificado digital (PFX) em Go se mostrou um desafio considerável, apesar do escopo inicial parecer simples. Após a conclusão, a implementação aparenta ser direta (são apenas 180 linhas), mas o processo exigiu várias iterações e entendimento detalhado sobre as limitações das ferramentas e bibliotecas disponíveis. A primeira abordagem consistiu em tentar, de forma monolítica, ler o PDF, aplicar o carimbo visual e assinar digitalmente em uma única etapa. No entanto, surgiram diversos entraves — em especial, a perda da assinatura digital após a inserção do carimbo, e erros decorrentes da manipulação do documento. Adicionalmente, muitas soluções baseadas em IA indicavam bibliotecas pagas ou APIs externas, ou ainda métodos inexistentes nas bibliotecas, tornando a busca por alternativas viáveis um processo repetitivo e pouco produtivo. O fluxo mais robusto — e funcional — consolidou-se apenas após dividir o processo em etapas claras, conforme ob...

Huguinho e o frango voador

Imagem
Diz a lenda que, na primeira vez que o Huguinho foi almoçar na casa dos pais da namorada dele (vamos chamar ela de Kely), ele conseguiu colecionar algumas pequenas gafes... Quando chegou no apartamento, digitou o número: 666*... quer dizer, 123. A mãe da Kely atendeu e rolou esse diálogo: [MÃE DA KELY] Pois não? [HUGUINHO] É do apartamento da... (branco total) da... (mais um branco) KEYLA? [MÃE DA KELY] É sim, pode subir. (super educada, deixou ele subir mesmo depois do errinho no nome da filha — mentira, o desespero era real mesmo! Huahauhauhauh) Mais tarde, sentaram para almoçar. O pai da Kely estava devorando um frango, limpando o osso como um mestre! Claro que o Huguinho não podia ficar pra trás, né? Só que, não familiarizado com o uso dos talheres (mentira!), ao tentar imitar o pai da Kely, o osso do frango voou — e aterrissou direto no prato do pai (verdade)!  Coisas de Huguinho... * Você, que é casado, entendeu!!!

WSL: Backup e Restauração

Imagem
Às vezes você tem um drive mais rápido (SSD) que o outro (HD). É o meu caso: meu drive C, é um SSD de 256 GB e meu drive D, é um HD de 512 GB. Um é pequeno e rápido; outro é grande e lento.  Meu drive C, por ser pequeno, acabou ficando sem espaço. Então fui pesquisar por grandes arquivos (usei o excelente TreeSize Free para isso) e descobri um tal de ext4.vhdx que tinha 29 GB. Esse arquivo é a imagem do disco do WSL no Windows e é normal ficar grande. O problema é que mesmo você apagando arquivos ele não diminui. E quando você usa o Docker, a situação se agrava rapidamente. Então, descobri uma maneira de compactar esse arquivo/disco. É um comentário da KarolineWss numa issue do WSL. Funciona maravilhosamente bem. Tanto que consegui diminuir praticamente pela metade o arquivo.  Mas para fazer isso, claro, pesquisei como fazer backup (e restauração). Esse artigo é sobre isso. E com um bônus, esse o arquivo fica numa localização meio complicada para humanos, mas fazendo um bac...

Código Limpo: Nomes Significativos

Imagem
Às vezes fico com um assunto na cabeça por semanas, até achar uma situação ou um exemplo que esclareça a situação. Explico: estava querendo já a algum tempo escrever sobre boas práticas de programação, e pensei em iniciar por "Nomes Significativos", para seguir a nomenclatura utilizada pelo ótimo livro Código Limpo , de Robert C. Martin.  Entretanto, ficava sempre amarrado em exemplos que pareciam ser bons, mas que ainda eu não tinha visto a utilidade prática.  Antes de continuar preciso explicar que tenho um hábito de anotar num bloco de papel todas as ideias que surgem, pois elas desaparecem com a mesma velocidade que aparecem. Para isso tenho um bloco e caneta na mesa de cabeceira (além de um no banheiro), pois esses são os lugares onde tenho mais ideias... Vai entender... Semana passada, estava com um problema bem complicado e tive uma ideia: "vou criar uma variável para indicar que quando um arquivo tiver um certo tamanho deve gravar algumas informações no log. Pois...

A incrível velocidade do Go

Imagem
Um dos motivos que gosto do Go (a linguagem de programação, não o jogo), é que ele é extremamente rápido. E não estou falando de utilizar goroutines pois aí é covardia. Estamos migrando um sistema de Coldfusion para Go e PHP e uma das rotinas insere um registro no banco de dados no início e outra no fim do processo. Pense como se fosse um log, mas um log específico para essa rotina. Dessa forma: 2023-05-18 17:45:03. 687     ... [processaImagem] Incorporando imagem 2023-05-18 17:45:03. 688     ... [processaImagem] Imagem incorporada Entre o inicio e o final do processamento levou 1ms. Até aí, tudo bem, se não fosse o fato dessa tabela ter o campo timestamp como parte da chave primária. Se reparar, o tempo é definido em milissegundos. Com o Coldfusion esse processo dura cerca de 20ms. Simplesmente migrando para Go, o tempo caiu muito, para menos de 1ms e assim, começou a dar erro de chave duplicada. A solução? Depende, sempre depende. No nosso contexto, a ma...

ABS (Arquitetura do Bom Senso): A Importância do Bom Senso na Arquitetura de Software

Durante as últimas semanas acompanhei algumas discussões sobre arquitetura de software e clean code. Por isso resolvi escrever esse artigo. A arquitetura de software é fundamental no desenvolvimento de sistemas de alta qualidade e desempenho. É responsável por definir a estrutura e organização do código-fonte, as interações entre os diferentes componentes e as diretrizes para garantir a escalabilidade, manutenibilidade e extensibilidade do sistema. No entanto, além de técnicas e padrões estabelecidos, existe um fator crucial que muitas vezes é negligenciado: o bom senso. Neste artigo, exploraremos a importância do bom senso na arquitetura de software, apresentando a ideia da ABS (Arquitetura do Bom Senso) e como ela pode impactar positivamente os projetos de desenvolvimento. O que é a ABS (Arquitetura do Bom Senso)? A ABS (Arquitetura do Bom Senso) é uma abordagem que destaca a importância de aplicar o bom senso durante o processo de arquitetura de software. Ela reconhece que as melhor...

Atual Momento da IA: ChatGPT

A inteligência artificial é um tema que vem ganhando cada vez mais espaço na nossa sociedade e tem a capacidade de mudar a forma como vivemos e trabalhamos. Atualmente, estamos testemunhando um marco na evolução da IA, com modelos como o ChatGPT liderando o caminho. O ChatGPT é um modelo de linguagem de ponta desenvolvido pela OpenAI. Ele foi treinado em milhões de páginas da web e possui uma incrível capacidade de compreender e gerar texto natural. Isso significa que ele pode responder a perguntas, escrever textos e até mesmo criar conversas com humanos, sem que eles percebam a diferença. O sucesso do ChatGPT é resultado de anos de pesquisa e desenvolvimento, e ele está mudando a forma como vemos a inteligência artificial. Antes, modelos de IA eram incapazes de compreender o significado por trás das palavras e apenas respondiam com base em padrões previamente programados. Agora, com o ChatGPT, a IA tem a capacidade de aprender e evoluir ao longo do tempo, tornando-se cada vez mais hu...

Dica rápida: .gitignore não "funciona"

Caso você tenha um arquivo que já estava versionado, e você agora quer removê-lo do versionamento, é necessário limpar o cache local do repositório. Para isso basta executar: git rm -r --cached <path_e_nome_arquivo>

Falha ao acessar a API da Binance

De uns tempos pra cá, meu programa que monitora o preço de ações e criptomoedas (tenho um post sobre isso), passou a receber a mensagem:  "Service unavailable from a restricted location according to 'b. Eligibility' in https://www.binance.com/en/terms. Please contact customer service if you believe you received this message in error."  Depois de muito pesquisar, descobri o problema: meu programa fica hospedado nos EUA, e eu uso o endereço base https://api.binance.com . A solução é bem simples, troque o endereço base por https://api.binance.us . O único porém é que alguns assets não existem no novo endereço. Por exemplo:  https://api.binance.us/api/v3/ticker/24hr?symbol=ETHBRL . Nesse caso, a única solução é trocar o ETHBRL por ETHUSD.

VSCode não roda?

Esses dias fiz uma atualização do VSCode (gosto de manter os softwares atualizados) e ele simplesmente não abriu mais. Clicava no ícone e ele abria e já fechava em seguida. Depois de muita pesquisa, não descobri o problema. Daí comecei a operar em modo desespero: Primeiro, tentei acessar sem nenhum extensão, pois imaginei que poderia ser um problema de compatibilidade de uma extensão com a nova versão do VSCode. Para isso rodei o comando: code --disable-extensions E nada. Ele simplesmente não dava sinal de vida. Em tempo: se precisar desinstalar uma extensão problemática via linha de comando use: code --uninstall-extersion <ext-id> O <ext-id> você consegue com o comando: code --list-extensions Depois, tentei baixar versões mais antigas, mas também não adiantou. https://code.visualstudio.com/updates Nessas horas a experiência conta muito: resolvi renomear o arquivo settings.json, e deu certo. Ele estava corrompido. Daí foi fácil descobrir o problema do arquivo e corrigir. Es...

Paradoxo Final: sem anúncios

Quando comecei o blog, em 2009, nunca pensei em ganhar dinheiro. Mas como alguns posts fizeram sucesso e tive meses que alcancei mais de 34 mil visualizações, o dinheiro começou a entrar. Quer dizer, os trocados, pois em 13 anos ganhei menos de 130 dólares.  De todo modo, em virtude disso, mantive os anúncios. E como somos acomodados por natureza, e mesmo o blog tendo muito menos visualizações, mantive os anúncios. Mas esse final de semana resolvi removê-los, afinal, não escrevo para ganhar dinheiro (até que gostaria, mas não tenho tempo), escrevo porque eu gosto. Então, espero que aproveitem a nova cara do Paradoxo Final.

Como traduzir (legendar) qualquer vídeo do Youtube

Imagem
Às vezes você encontra um vídeo no Youtube com a solução do seu problema, mas ele está em uma língua que você não domina. Normalmente, você olha se tem legenda, e na maioria dos casos ou não tem, ou só tem na própria língua do vídeo Aí você abandona o caso, certo? O que muita gente não sabe é que o próprio Youtube permite você legendar em qualquer língua (que ele tenha disponível).  O segredo é clicar em Legendas primeiro, e depois em Configurações. Assim, aparecerá a opção "Traduzir automaticamente". Ao clicar nessa opção, basta escolher o idioma da tradução. Clique no ícone Legendas e no item de menu Legendas Clique em Traduzir automaticamente Selecione o idioma Voilá! Infelizmente se você fechar o vídeo será preciso executar o processo novamente.

Dicas Go - #1 - Goroutines

Imagem
Já falei um pouco sobre concorrência em Go , mas percebi que não fui muito esclarecedor, por isso vou fazer uma outra abordagem, mais detalhada, sobre esse assunto. O código completo dos programas está no final do texto. Vamos imaginar que você queira fazer um programa que faça acesso à uma API algumas vezes e retorne o resultado como string. Para não tornar o programa muito complexo, utilizei uma pesquisa fake, que simula um retorno e gasta  100 milissegundos. Ao rodar o programa sequencial.go, vemos na tela uma saída como a abaixo: Como esperado, os resultados são listados em ordem, de "golang 0" à "golang 19". E o tempo gasto, pouco mais de 2s, também não é nenhuma surpresa (20 vezes 100 milissegundos mais algum tempo do resto do código). A coisa começa a melhorar quando rodamos o programa concorrente.go. O tempo gasto reduziu de 2s para 100ms. Qual é a mágica? São as goroutines! Se reparar bem, são poucas mudanças em relação ao código original (na verdade, essa ...

Iniciando o Windows Terminal com layout pré-definido (4 janelas)

Imagem
Se você gosta ou precisa usar o Windows Terminal (WT), talvez já tenha sentido a necessidade de abrir várias abas. Mas dependendo do que você faz, várias abas não são assim tão confortáveis para trabalhar, . Por exemplo: você sobe um servidor numa aba e em outro dispara comandos CURL para verificar se sua API está respondendo a contento. Nesse caso, você precisa ficar alternando entre as abas para ver o resultado. E se desse para ver tudo de uma só vez?  O melhor é que dá sim. E é fácil! Basicamente, você chama o executável do WT (wt.exe) passando alguns argumentos. Nesse link , tem uma descrição completa dos argumentos. Uma janela como a de cima, pode ser obtida com o comando: wt.exe -M -d d:\temp ; sp wsl.exe ~ ; mf left ; sp -d d:\dev ; mf right; sp -d d:\bin\monitor Uma breve descrição dos argumentos utilizados acima: -M maximiza a tela -d abre a janela em um determinado diretório sp (split-panel) divide uma janela/painel mf (move-focus) move o foco numa direção (...

Upload com PHP+JQUERY em AJAX e na mesma página

Se você já perdeu horas procurando um código em PHP que funcionasse para fazer o upload de imagens mas que fizesse isso com AJAX e ainda por cima na mesma página, espero que esse post te ajude! Crie uma pasta para armazenar as imagens que aqui chamo de upload. Copie e cole o código abaixo (testado com XAMPP localmente): <?php if(isset($_FILES['file']['name'])){    /* Pega o nome do arquivo*/    $filename = $_FILES['file']['name'];    /* Local onde sera salvo o arquivo*/    $location = "upload/".$filename;    $imageFileType = pathinfo($location,PATHINFO_EXTENSION);    $imageFileType = strtolower($imageFileType);    /* Extensoes validas */    $valid_extensions = array("jpg","jpeg","png");    /* Checa a extensao do arquivo */    if(in_array(strtolower($imageFileType), $valid_extensions)) {       /* Faz o upload */       move_uploaded_file($_FILES['file']['...

O dia que o Australian Crawl chegou à Balneário Camboriú

Imagem
Já falei um pouco do Australian Crawl aqui . O que não contei é que fui um dos primeiros a ouvir a banda em Balneário Camboriú. Como diz o Lito, do Aviões e Músicas: "Senta que lá vem história" (pequena, mas é uma história).  Estamos falando do início dos anos 80, e naquela época para ouvir alguma música nova, era só através de fitas. E eu dia, na casa de um primo de Florianópolis, ouvi essa banda. Claro que fiz uma cópia. Mas gostei tanto que fui atrás da história de como ela chegou no Brasil: um amigo dele tinha ido à Indonésia e parece que ele conseguiu através de um australiano que estava ou morava lá. Não sei se é verdade ou não, mas é o que me contaram.  Quando voltei para casa, em Balneário Camboriú, passei a ouvir a fita diariamente (e várias vezes ao dia). E não deu outra: alguns amigos ouviram, gostaram, copiaram e daí viralizou. Tinha um amigo que falava: "Xande, tu é o primeiro cara que ouviu Australian aqui!".

Huguinho, surfe e tubarões

Imagem
Certa vez, após voltar da Oktoberfest, Huguinho decidiu surfar para curar a ressaca, pois todos sabem que Coca-Cola não cura ressaca:  Huguinho, Oktober e Coca-Cola.   Só que aquele dia, o mar estava grande e quebrando bem longe da areia.  Talvez não estivesse tão grande... Depois de pegar algumas (boas) ondas, Huguinho vai um pouco mais para outside para descansar um pouco. Não demorou muito e apareceram vários golfinhos em sua volta.  O que era Mas na hora, ainda meio grogue, a centenas de metros da areia, sozinho na imensidão do oceano, ele achou que fossem tubarões.  Até hoje não se sabe de ninguém que saiu tão rápido da água! O que Huguinho achou que era

Dica rápida em Golang - blank identifier

Se você está usando o pacote database/sql com mysql e recebe a mensagem "Commands out of sync. Did you run multiple statements at once?", verifique se você não está usando um "blank identifier" no retorno da função "Query", por exemplo. _, err := db.Query("...") nesse caso, basta pegar o primeiro retorno (rows) e chamar o método Close() rows, err := db.Query("...")defer rows.Close()

Como aprender a programar

Imagem
Estava assistindo um vídeo do Fabio Akita, "A Dor de Aprender | Que Cursos/Livros"  e em determinado momento, ele falou sobre os microcomputadores antigos, da década de 80, como o TK95. E logo depois ele pergunta: "Como pessoas como eu, quando criança, conseguimos aprender a programar num ambiente muito mais hostil do que hoje em dia?". Isso me fez lembrar do meu início como programador, em 1985, mesmo ano que comecei a surfar. Já explico o que o surfe tem a ver com isso. Como ele mesmo diz, naquela época as máquinas eram extremamente limitadas. Perto de agora, a situação realmente não era fácil: não existia internet, poucos livros e cursos, e principalmente não existia o Github. No máximo, algumas revistas como Micro Hobby e Micro Sistemas.  O meu primeiro computador foi um TK2000  e ele vinha com um manual que ensinava o básico do Basic (isso soou estranho). Meu pai também sabia um pouquinho: ele criou um programa que escolhia um número aleatório e você tentava ad...