helio.loureiro.eng.br
  • Home
  • Unix
  • Linux
  • Blog
  • Python
  • Programação
  • Tudo
  • Suécia
  1. You are here:  
  2. Home

Os artigos mais lidos de 2025

  • Configurando traefik com ssh
  • Configurando o grafana alloy pra monitorar VMs
  • Acessos de robôs nos logs web
  • Configurando o teclado Keychron C3 no Linux
  • Parâmetros de compilação pra Go!

Home

Minha palestra sobre mastodon na VIII BSD Day

Details
Written by: Helio Loureiro
Category: Blog
Published: May 29, 2023
Hits: 3347

E no fim de semana fiz a palestra sobre mastodon com toot e Mastodon.py.

Por algum motivo bizarro minha câmera ficou travando.   Como está tudo num só hub USB, pode ser que o bus não esteja aguentando.   Então pra próxima palestrar online vou tentar fazer algum update aqui no setup pra evitar esse tipo de problema.

Unzip com erro illegal byte sequence no MacOS

Details
Written by: Helio Loureiro
Category: MacOS/Darwin/BSD
Published: May 25, 2023
Hits: 3645

Recentemente eu descobri que minha conta corporativa no Google, que uso pra gerenciar o loureiro.eng.br no geral, custa muito caro pra aumentar o tamanho do storage.  Mas muito.

Então resolvi voltar a usar minha conta genérica do Google/Gmail pra colocar fotos e tudo mais que estava entupindo meu espaço virtual no loureiro.eng.br e afetando o serviço de email entre outras coisas.

Passei então a baixar os albuns que tinha lá, abrir o arquivo em formato zip, extrair os dados e subir na conta genérica que agora tem 200 GB de espaço.

Mas eis que...

$ unzip Sexta-feira\ de\ manhã-001.zip
Archive:  Sexta-feira de manhã-001.zip
checkdir error:  cannot create Sexta-feira de manh+�
                 Illegal byte sequence
                 unable to process Sexta-feira de manh+�/GOPR2787_1553588194745_high.JPG.
checkdir error:  cannot create Sexta-feira de manh+�
                 Illegal byte sequence
                 unable to process Sexta-feira de manh+�/GOPR2815_1553588196860_high.JPG.
checkdir error:  cannot create Sexta-feira de manh+�
                 Illegal byte sequence
                 unable to process Sexta-feira de manh+�/GOPR2733_1553287304138_high.JPG.
checkdir error:  cannot create Sexta-feira de manh+�
                 Illegal byte sequence
                 unable to process Sexta-feira de manh+�/GOPR2765_1553588192848_high.JPG.
checkdir error:  cannot create Sexta-feira de manh+�
                 Illegal byte sequence
                 unable to process Sexta-feira de manh+�/GOPR2805_1553588196125_high.JPG.
checkdir error:  cannot create Sexta-feira de manh+�
                 Illegal byte sequence
                 unable to process Sexta-feira de manh+�/GOPR2766_1553588192990_high.JPG.
checkdir error:  cannot create Sexta-feira de manh+�
                 Illegal byte sequence
                 unable to process Sexta-feira de manh+�/GOPR2804_1553588196053_high.JPG.
checkdir error:  cannot create Sexta-feira de manh+�
                 Illegal byte sequence
                 unable to process Sexta-feira de manh+�/GOPR2737_1553287304362_high.JPG.
checkdir error:  cannot create Sexta-feira de manh+�
                 Illegal byte sequence
                 unable to process Sexta-feira de manh+�/GOPR2816_1553588196891_high.JPG.
checkdir error:  cannot create Sexta-feira de manh+�
                 Illegal byte sequence
                 unable to process Sexta-feira de manh+�/GOPR2772_1553588193399_high.JPG.
checkdir error:  cannot create Sexta-feira de manh+�
                 Illegal byte sequence
                 unable to process Sexta-feira de manh+�/GOPR2789_1553588194826_high.JPG.
checkdir error:  cannot create Sexta-feira de manh+�
                 Illegal byte sequence
                 unable to process Sexta-feira de manh+�/GOPR2792_1553588195166_high.JPG.
checkdir error:  cannot create Sexta-feira de manh+�
                 Illegal byte sequence
                 unable to process Sexta-feira de manh+�/GOPR2802_1553588195831_high.JPG.
checkdir error:  cannot create Sexta-feira de manh+�
                 Illegal byte sequence
                 unable to process Sexta-feira de manh+�/GOPR2769_1553588193183_high.JPG.
checkdir error:  cannot create Sexta-feira de manh+�
                 Illegal byte sequence
                 unable to process Sexta-feira de manh+�/GOPR2735_1553287304243_high.JPG.
checkdir error:  cannot create Sexta-feira de manh+�
                 Illegal byte sequence
                 unable to process Sexta-feira de manh+�/GOPR2764_1553588192788_high.JPG.
checkdir error:  cannot create Sexta-feira de manh+�
                 Illegal byte sequence
                 unable to process Sexta-feira de manh+�/GOPR2809_1553588196428_high.JPG.
checkdir error:  cannot create Sexta-feira de manh+�
                 Illegal byte sequence
                 unable to process Sexta-feira de manh+�/GOPR2793_1553588195213_high.JPG.
checkdir error:  cannot create Sexta-feira de manh+�
                 Illegal byte sequence
                 unable to process Sexta-feira de manh+�/GOPR2781_1553588194244_high.JPG.
checkdir error:  cannot create Sexta-feira de manh+�
                 Illegal byte sequence
                 unable to process Sexta-feira de manh+�/GOPR2814_1553588196818_high.JPG.
checkdir error:  cannot create Sexta-feira de manh+�
                 Illegal byte sequence
                 unable to process Sexta-feira de manh+�/GOPR2785_1553588194565_high.JPG.
checkdir error:  cannot create Sexta-feira de manh+�
                 Illegal byte sequence
                 unable to process Sexta-feira de manh+�/GOPR2784_1553588194484_high.JPG.
checkdir error:  cannot create Sexta-feira de manh+�
                 Illegal byte sequence
                 unable to process Sexta-feira de manh+�/GOPR2812_1553588196668_high.JPG.
checkdir error:  cannot create Sexta-feira de manh+�
                 Illegal byte sequence
                 unable to process Sexta-feira de manh+�/GOPR2779_1553588194000_high.JPG.
checkdir error:  cannot create Sexta-feira de manh+�
                 Illegal byte sequence
                 unable to process Sexta-feira de manh+�/GOPR2813_1553588196753_high.JPG.
checkdir error:  cannot create Sexta-feira de manh+�
                 Illegal byte sequence
                 unable to process Sexta-feira de manh+�/GOPR2771_1553588193350_high.JPG.
checkdir error:  cannot create Sexta-feira de manh+�
                 Illegal byte sequence
                 unable to process Sexta-feira de manh+�/GOPR2770_1553588193282_high.JPG.
checkdir error:  cannot create Sexta-feira de manh+�
                 Illegal byte sequence
                 unable to process Sexta-feira de manh+�/GOPR2734_1553287304192_high.JPG.
checkdir error:  cannot create Sexta-feira de manh+�
                 Illegal byte sequence
                 unable to process Sexta-feira de manh+�/GOPR2776_1553588193839_high.JPG.
checkdir error:  cannot create Sexta-feira de manh+�
                 Illegal byte sequence
                 unable to process Sexta-feira de manh+�/GOPR2811_1553588196578_high.JPG.
checkdir error:  cannot create Sexta-feira de manh+�
                 Illegal byte sequence
                 unable to process Sexta-feira de manh+�/GOPR2782_1553588194320_high.JPG.
checkdir error:  cannot create Sexta-feira de manh+�
                 Illegal byte sequence
                 unable to process Sexta-feira de manh+�/GOPR2732_1553287303926_high.JPG.
checkdir error:  cannot create Sexta-feira de manh+�
                 Illegal byte sequence
                 unable to process Sexta-feira de manh+�/GOPR2810_1553588196503_high.JPG.
checkdir error:  cannot create Sexta-feira de manh+�
                 Illegal byte sequence
                 unable to process Sexta-feira de manh+�/GOPR2774_1553588193500_high.JPG.
checkdir error:  cannot create Sexta-feira de manh+�
                 Illegal byte sequence
                 unable to process Sexta-feira de manh+�/GOPR2780_1553588194048_high.JPG.
checkdir error:  cannot create Sexta-feira de manh+�
                 Illegal byte sequence
                 unable to process Sexta-feira de manh+�/GOPR2795_1553588195371_high.JPG.
checkdir error:  cannot create Sexta-feira de manh+�
                 Illegal byte sequence
                 unable to process Sexta-feira de manh+�/GOPR2736_1553287304300_high.JPG.
checkdir error:  cannot create Sexta-feira de manh+�
                 Illegal byte sequence
                 unable to process Sexta-feira de manh+�/GOPR2808_1553588196356_high.JPG.
checkdir error:  cannot create Sexta-feira de manh+�
                 Illegal byte sequence
                 unable to process Sexta-feira de manh+�/GOPR2767_1553588193040_high.JPG.
checkdir error:  cannot create Sexta-feira de manh+�
                 Illegal byte sequence
                 unable to process Sexta-feira de manh+�/GOPR2817_1553588197051_high.MP4.

Um erro de utf-8 no MacOS.  O nome do álbum é "Sexta-feira de manhã".  É, faltou um pouco de criatividade aqui.  E o unzip no MacOS não consegue de jeito nenhum resolver isso.  Mais provavelmente por limitação do APFS, o filesystem da Apple (que não é lá grande coisa).

Buscando na Internet achei uma referência aqui: https://github.com/adamhathcock/sharpcompress/issues/315

Então basicamente eu usei o "ditto" pra resolver meu problema.

$ mkdir recuperação
$ cd recuperação/
$ ditto -V -x -k --sequesterRsrc --rsrc ../Sexta-feira\ de\ manhã-001.zip .
>>> Copying ../Sexta-feira de manhã-001.zip
copying file Sexta-feira de manhã/GOPR2787_1553588194745_high.JPG ...
467431 bytes for Sexta-feira de manhã/GOPR2787_1553588194745_high.JPG
copying file Sexta-feira de manhã/GOPR2815_1553588196860_high.JPG ...
510835 bytes for Sexta-feira de manhã/GOPR2815_1553588196860_high.JPG
copying file Sexta-feira de manhã/GOPR2733_1553287304138_high.JPG ...
761484 bytes for Sexta-feira de manhã/GOPR2733_1553287304138_high.JPG
copying file Sexta-feira de manhã/GOPR2765_1553588192848_high.JPG ...
468822 bytes for Sexta-feira de manhã/GOPR2765_1553588192848_high.JPG
copying file Sexta-feira de manhã/GOPR2805_1553588196125_high.JPG ...
787425 bytes for Sexta-feira de manhã/GOPR2805_1553588196125_high.JPG
copying file Sexta-feira de manhã/GOPR2766_1553588192990_high.JPG ...
1058611 bytes for Sexta-feira de manhã/GOPR2766_1553588192990_high.JPG
copying file Sexta-feira de manhã/GOPR2804_1553588196053_high.JPG ...
995234 bytes for Sexta-feira de manhã/GOPR2804_1553588196053_high.JPG
copying file Sexta-feira de manhã/GOPR2737_1553287304362_high.JPG ...
1011534 bytes for Sexta-feira de manhã/GOPR2737_1553287304362_high.JPG
copying file Sexta-feira de manhã/GOPR2816_1553588196891_high.JPG ...
511600 bytes for Sexta-feira de manhã/GOPR2816_1553588196891_high.JPG
copying file Sexta-feira de manhã/GOPR2772_1553588193399_high.JPG ...
823201 bytes for Sexta-feira de manhã/GOPR2772_1553588193399_high.JPG
copying file Sexta-feira de manhã/GOPR2789_1553588194826_high.JPG ...
822008 bytes for Sexta-feira de manhã/GOPR2789_1553588194826_high.JPG
copying file Sexta-feira de manhã/GOPR2792_1553588195166_high.JPG ...
1876322 bytes for Sexta-feira de manhã/GOPR2792_1553588195166_high.JPG
copying file Sexta-feira de manhã/GOPR2802_1553588195831_high.JPG ...
914018 bytes for Sexta-feira de manhã/GOPR2802_1553588195831_high.JPG
copying file Sexta-feira de manhã/GOPR2769_1553588193183_high.JPG ...
675609 bytes for Sexta-feira de manhã/GOPR2769_1553588193183_high.JPG
copying file Sexta-feira de manhã/GOPR2735_1553287304243_high.JPG ...
1699626 bytes for Sexta-feira de manhã/GOPR2735_1553287304243_high.JPG
copying file Sexta-feira de manhã/GOPR2764_1553588192788_high.JPG ...
2014672 bytes for Sexta-feira de manhã/GOPR2764_1553588192788_high.JPG
copying file Sexta-feira de manhã/GOPR2809_1553588196428_high.JPG ...
2000556 bytes for Sexta-feira de manhã/GOPR2809_1553588196428_high.JPG
copying file Sexta-feira de manhã/GOPR2793_1553588195213_high.JPG ...
988673 bytes for Sexta-feira de manhã/GOPR2793_1553588195213_high.JPG
copying file Sexta-feira de manhã/GOPR2781_1553588194244_high.JPG ...
2254617 bytes for Sexta-feira de manhã/GOPR2781_1553588194244_high.JPG
copying file Sexta-feira de manhã/GOPR2814_1553588196818_high.JPG ...
1815341 bytes for Sexta-feira de manhã/GOPR2814_1553588196818_high.JPG
copying file Sexta-feira de manhã/GOPR2785_1553588194565_high.JPG ...
2126053 bytes for Sexta-feira de manhã/GOPR2785_1553588194565_high.JPG
copying file Sexta-feira de manhã/GOPR2784_1553588194484_high.JPG ...
1961346 bytes for Sexta-feira de manhã/GOPR2784_1553588194484_high.JPG
copying file Sexta-feira de manhã/GOPR2812_1553588196668_high.JPG ...
1007050 bytes for Sexta-feira de manhã/GOPR2812_1553588196668_high.JPG
copying file Sexta-feira de manhã/GOPR2779_1553588194000_high.JPG ...
1612054 bytes for Sexta-feira de manhã/GOPR2779_1553588194000_high.JPG
copying file Sexta-feira de manhã/GOPR2813_1553588196753_high.JPG ...
2126066 bytes for Sexta-feira de manhã/GOPR2813_1553588196753_high.JPG
copying file Sexta-feira de manhã/GOPR2771_1553588193350_high.JPG ...
378743 bytes for Sexta-feira de manhã/GOPR2771_1553588193350_high.JPG
copying file Sexta-feira de manhã/GOPR2770_1553588193282_high.JPG ...
1995866 bytes for Sexta-feira de manhã/GOPR2770_1553588193282_high.JPG
copying file Sexta-feira de manhã/GOPR2734_1553287304192_high.JPG ...
1689565 bytes for Sexta-feira de manhã/GOPR2734_1553287304192_high.JPG
copying file Sexta-feira de manhã/GOPR2776_1553588193839_high.JPG ...
1793406 bytes for Sexta-feira de manhã/GOPR2776_1553588193839_high.JPG
copying file Sexta-feira de manhã/GOPR2811_1553588196578_high.JPG ...
2326771 bytes for Sexta-feira de manhã/GOPR2811_1553588196578_high.JPG
copying file Sexta-feira de manhã/GOPR2782_1553588194320_high.JPG ...
2258922 bytes for Sexta-feira de manhã/GOPR2782_1553588194320_high.JPG
copying file Sexta-feira de manhã/GOPR2732_1553287303926_high.JPG ...
2001698 bytes for Sexta-feira de manhã/GOPR2732_1553287303926_high.JPG
copying file Sexta-feira de manhã/GOPR2810_1553588196503_high.JPG ...
2709410 bytes for Sexta-feira de manhã/GOPR2810_1553588196503_high.JPG
copying file Sexta-feira de manhã/GOPR2774_1553588193500_high.JPG ...
2058495 bytes for Sexta-feira de manhã/GOPR2774_1553588193500_high.JPG
copying file Sexta-feira de manhã/GOPR2780_1553588194048_high.JPG ...
1882808 bytes for Sexta-feira de manhã/GOPR2780_1553588194048_high.JPG
copying file Sexta-feira de manhã/GOPR2795_1553588195371_high.JPG ...
2403193 bytes for Sexta-feira de manhã/GOPR2795_1553588195371_high.JPG
copying file Sexta-feira de manhã/GOPR2736_1553287304300_high.JPG ...
1576599 bytes for Sexta-feira de manhã/GOPR2736_1553287304300_high.JPG
copying file Sexta-feira de manhã/GOPR2808_1553588196356_high.JPG ...
2032676 bytes for Sexta-feira de manhã/GOPR2808_1553588196356_high.JPG
copying file Sexta-feira de manhã/GOPR2767_1553588193040_high.JPG ...
2080346 bytes for Sexta-feira de manhã/GOPR2767_1553588193040_high.JPG
copying file Sexta-feira de manhã/GOPR2817_1553588197051_high.MP4 ...
351123 bytes for Sexta-feira de manhã/GOPR2817_1553588197051_high.MP4

Nada muito simples, mas funciona e fica aqui registrado pra futura referência.

ditto -V -x -k --sequesterRsrc --rsrc arquivo.zip diretório_destino

Falando sobre Mastodon na BSD Day 2023

Details
Written by: Helio Loureiro
Category: Pessoal
Published: May 15, 2023
Hits: 3155

Foi selecionado pra falar na BSD Day 2023.  E o assunto?  Mastodon!  Vou falar da rede federada assim como os programas mais legais pra usar e automatizar a brincadeira.

Mais informações sobre o evento: https://www.bsdday.com.br

Gerando vídeo de images jpeg com ffmpeg usando aceleração de hardware no MacOS

Details
Written by: Helio Loureiro
Category: MacOS/Darwin/BSD
Published: May 15, 2023
Hits: 3173
  • ffmpeg
  • Apple Silicon
  • aceleração de hardware
  • gopro

Eu já escrevi sobre isso em Linux com Intel (Usando a GPU para renderizar vídeo) e depois em Linux com NVIDIA (Renderizando as fotos da GoPro em vídeo mpeg4 com ffmpeg e NVIDIA).  Agora eu testei como fazer isso no MacOS.

E deu muito certo.

O comando e saída foram esses:

$ ffmpeg -r 1 -i G%04d.JPG -c:v h264_videotoolbox -b:v 5M -pix_fmt yuv420p output.mp4
ffmpeg version 6.0 Copyright (c) 2000-2023 the FFmpeg developers
  built with Apple clang version 14.0.3 (clang-1403.0.22.14.1)
  configuration: --prefix=/opt/homebrew/Cellar/ffmpeg/6.0 --enable-shared --enable-pthreads 
--enable-version3 --cc=clang --host-cflags= --host-ldflags= --enable-ffplay --enable-gnutls
--enable-gpl --enable-libaom --enable-libaribb24 --enable-libbluray --enable-libdav1d
--enable-libmp3lame --enable-libopus --enable-librav1e --enable-librist --enable-librubberband
--enable-libsnappy --enable-libsrt --enable-libsvtav1 --enable-libtesseract --enable-libtheora
--enable-libvidstab --enable-libvmaf --enable-libvorbis --enable-libvpx --enable-libwebp
--enable-libx264 --enable-libx265 --enable-libxml2 --enable-libxvid --enable-lzma
--enable-libfontconfig --enable-libfreetype --enable-frei0r --enable-libass
--enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libspeex
--enable-libsoxr --enable-libzmq --enable-libzimg --disable-libjack --disable-indev=jack
--enable-videotoolbox --enable-neon libavutil 58. 2.100 / 58. 2.100 libavcodec 60. 3.100 / 60. 3.100 libavformat 60. 3.100 / 60. 3.100 libavdevice 60. 1.100 / 60. 1.100 libavfilter 9. 3.100 / 9. 3.100 libswscale 7. 1.100 / 7. 1.100 libswresample 4. 10.100 / 4. 10.100 libpostproc 57. 1.100 / 57. 1.100 Input #0, image2, from 'G%04d.JPG': Duration: 00:03:05.08, start: 0.000000, bitrate: N/A Stream #0:0: Video: mjpeg (Baseline), yuvj422p(pc, bt470bg/unknown/unknown), 4000x3000, 25 fps, 25 tbr, 25 tbn File 'output.mp4' already exists. Overwrite? [y/N] y Stream mapping: Stream #0:0 -> #0:0 (mjpeg (native) -> h264 (h264_videotoolbox)) Press [q] to stop, [?] for help [swscaler @ 0x130018000] deprecated pixel format used, make sure you did set range correctly [swscaler @ 0x128478000] deprecated pixel format used, make sure you did set range correctly [swscaler @ 0x138008000] deprecated pixel format used, make sure you did set range correctly [swscaler @ 0x108e58000] deprecated pixel format used, make sure you did set range correctly Output #0, mp4, to 'output.mp4': Metadata: encoder : Lavf60.3.100 Stream #0:0: Video: h264 (avc1 / 0x31637661), yuv420p(tv, bt470bg/unknown/unknown, progressive), 4000x3000, q=2-31, 5000 kb/s, 1 fps, 16384 tbn Metadata: encoder : Lavc60.3.100 h264_videotoolbox frame= 4627 fps= 21 q=-0.0 Lsize= 2824030kB time=01:17:06.00 bitrate=5001.0kbits/s speed=21.5x video:2823985kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.001582%

O que fez a mágica aqui foi o parâmetro "h264_videotoolbox".  Juntei 4626 imagens JPEG da última pedalada que fizemos em um vídeo de pouco mais de 1 hora.  E agora vou trabalhar em cima pra fazer o vídeo no formato adequado, trilha sonora e tamanho menor.

Vídeos da PyCon Suécia 2022 liberados

Details
Written by: Helio Loureiro
Category: Blog
Published: May 03, 2023
Hits: 2817

Um dos motivos de ter escrito pouco aqui é que entre outras coisas estou trabalhando os vídeos da conferência do ano passado pra serem liberados.

E estão.  Já acabei de re-renderizar novamente os vídeos com a introdução (pra adicionar patrocinadores, uma descrição do vídeo, etc) e subi pro YouTube.  E fiz outro script pra enviar aos autores pra verificarem seus vídeos e confirmarem.

E aqui estou eu lá nos lightning talks.

Os vídeos estão indo pro ar conforme são aprovados, mas já pode ver o que foi publicado seguindo a playlist:

 

O desencurtador de links pra tor-browser no telefone

Details
Written by: Helio Loureiro
Category: Python
Published: April 16, 2023
Hits: 3018

Com a migração pra rede Mastodon, eu agora sigo alguns bots que postam notícias, como esse do UOL que postou uma notícia sobre tubarões.

O problema é só com os links encurtados pelo t.co do Twitter.  Eles simplesmente não funcionam no tor-browser.  Simplesmente não consigo receber o destino desses links.

A solução que encontrei foi criar um pequeno script em CGI usando python que recebe a URL, busca o link destino e redireciona o browser.

O script é basicamente esse aqui:

#! /usr/bin/python3

import cgi
import requests

def renderPage():
    print("Content-type: text/html;utf-8\n")
    print("""    
<label for="link">Enter the url: 
<input id="link" name="link" type="text" />
 <input type="submit" value="submit" />
""") 
form = cgi.FieldStorage() 
url = form.getvalue("link") 
if url is None: 
    renderPage() 
else: 
    req = requests.get(url) 
    print(f"Location: {req.url}\n\n")

O pessoal de javascript deve morrer de desgosto de ver uma interface tão simplificada e que usa o servidor pra gerar a respostas.  Mas é o que sei fazer.  No fim eu simplesmente salvo o link no bookmarks e abro o mesmo cada vez que preciso usar.  Então é copiar o link da barra de url, abrir o bookmarks, clicar no link salvo do CGI, ir na caixa de diálogo, colar a url e pressionar o botão "submit".

 

Daí é só colar o link e deixar a mágica acontecer.

  

O link pra quem quiser usar o serviço é esse aqui:

https://helio.loureiro.eng.br/cgi-bin/links.cgi

Renderizando as fotos da GoPro em vídeo mpeg4 com ffmpeg e NVIDIA

Details
Written by: Helio Loureiro
Category: Linux
Published: April 16, 2023
Hits: 2737

Eu já tinha descrito como usar aceleração de hardware pra juntar imagens jpeg e criar um vídeo em usando a GPU para renderizar vídeo.  Mas o texto todo abordou apenas os testes que fiz no laptop que tinha na época, com GPU integrada Intel.

E como fazer o mesmo com NVIDIA?

Aqui está a receita de bolo direta:

ffmpeg -hwaccel cuda -hwaccel_output_format cuda -r 1 -i G%04d.JPG -c:v h264_nvenc -b:v 5M -pix_fmt cuda output.mp4

Simples assim ele gera uma grande image output.mp4, que depois eu uso no kdenlive.

Claro que não é assim tão simples.  É preciso ter os arquivos da GoPro gerados no padrão G0000.JPG, G0001.JPG, etc.

O que faço então é copiar todos os arquivos que vou precisar dentro do mesmo diretório (uso Gwenview pra isso).  E depois eu rodo o seguinte script:

#! /usr/bin/env bash

counter=0
for img in G*.JPG
do
  serial=$(printf "%04d" $counter)
  new_name="G${serial}.JPG"
  echo "$img => $new_name"
  mv $img $new_name
  counter=$((counter++))
done

ffmpeg -hwaccel cuda -hwaccel_output_format cuda -r 1 -i G%04d.JPG -c:v h264_nvenc -b:v 5M -pix_fmt cuda output.mp4

E pronto.  Imagem gerada em output.mp4 pra ser usada no kdenlive.

Como eu não consegui fazer o kdenlive funcionar bem com a placa NVIDIA, é mais rápido fazer essa primeira geração assim via ffmpeg mesmo.

O script está disponível no GitHub:

https://github.com/helioloureiro/homemadescripts/blob/master/render-video-from-gopro-photos.sh

Linux-BR com cara nova

Details
Written by: Helio Loureiro
Category: Blog
Published: April 06, 2023
Hits: 2628
  • joomla4
  • linux-br.org
  • wordpress

Depois de um logo tempo sem mexer no Linux-BR, finalmente dei o tapa que precisava pra renovar o site.  Não só de tema.  Foi absolutamente de tudo.

Eu passei um tempo tentando resolver os problemas que vieram depois do upgrade pro Joomla4.  Os mesmo problemas eu não tive aqui no blog, mas não sei dizer o motivo.  E também eu queria automatizar mais os posts de notícias.  E passei um tempo tentando fazer funcionar no Joomla4 com API, XML-RPC... tudo quando foi jeito.  E nada.  Fracassei miseravelmente em todas as minhas tentativas.

Daí resolvi chutar o balde e partir pra mudar tudo.  Subi um container localmente com o backup do Joomla e fiz uma migração pro WordPress.  Isso mesmo, WordPress.   Tudo que eu precisava fazer funcionar estava lá, e funcionando: site, notícias, API, tudo!  Bom... quase tudo.  Mas eu já chego lá.  Com o site rodando localmente instalei e migrei os dados.  Olhei como tinha ficado e parti pro site novo.  Botei no ar.

Em seguida foi fazer um bot pra postar notícias.  Essa parte não foi tão fácil como imaginei.  Até que foi, mas eu apanhei bastante pra descobrir como subir imagem no post.  O código está disponível aqui:

https://github.com/helioloureiro/linux-br.org-news-bot

Eu usei um plugin de JWT, JSON Web-Token, pra gerar um token de acesso.  Isso tornou a vida mais fácil, assim como uso da API.

Eu ainda preciso melhorar pra filtrar alguns posts que eu pego do hacker news, mas tudo funciona agora de forma automática.  Claro que ainda podemos enviar posts manualmente.  E aindei fazendo isso.  Mas o grosso das notícias vem de fora (o que traz algumas vezes coisas não muito relacionadas com o tema do site e precisa de uma curadoria manual).

O próximo passo é tentar fazer uma seleção de tags por post pra ajudar a mapear.

E o melhor de tudo... eu usei ajuda do ChatGPT pra conseguir fazer tudo.  Ou quase tudo.

Ele me deu umas dicas furadas pra parte de imagem, que consegui resolver achando um artigo que usava curl pra isso:

https://dev.to/dennislwm/deploy-a-wordpress-pipeline-to-minimize-and-upload-images-28k2

No fim deu tudo certo e o site e bot de notícias estão no ar.  Agora é aguardar por notícias, criar outro bot pra publicar no Mastodon e fazer aquele filtro maroto.  Ah!  E claro tentar arrumar o que realmente faltou: disqus.  O plugin não existe pra Joomla4,  mas tem suporte pra WordPress.  Só que não funcionou muito bem quando instalei e agora está dando uns erros bizarros.  Algo pra olhar com calma durante o feriado de Páscoa.

Irei mudar o site pra WordPress?  Ainda não.  E não tenho planos pra isso.  Eu tenho uma relação emocional com o Joomla, desde a época do MamboServer.  Será difícil cortar essa relação assim.  Mas agora tenho o Linux-BR pra comparar.

Enquanto isso, curtimos a Páscoa sueca com neve.

 

Reconectando por software um dispositivo USB no Linux

Details
Written by: Helio Loureiro
Category: Linux
Published: March 19, 2023
Hits: 2710

Por algum motivo bizarro meu mouse passou a não funcionar quando ligo meu PC.  A propósito, para fazer minha parte quanto à crise energética na europa, eu passei a deixar meu PC desligado.  Só o ligo quando vou usar, e depois desligo novamente.  Algo que não fazia há algumas décadas.

Mas voltando ao assunto mouse, por algum motivo bizarro o mouse parou de funcionar.  Ao desconectar e reconectar na USB, ele passava a funcionar.

Então resolvi fazer isso por software, num script que botei no /etc/rc.local, uma vez que rodo o rc-local no systemd.

MOUSE_PRODUCT="G203 Prodigy Gaming Mouse"

cd /sys/bus/usb/devices || \
  die "It seems /sys interface isn't available."

echo "Detecting mouse:"
mouse_id=""
for d in *
do
  if [ ! -f "$d/product" ]; then
    continue
  fi
  echo -n " * $d: "
  product=$(cat $d/product)

  if [ "$product" = "$MOUSE_PRODUCT" ]; then
    echo "$product (DEVICE FOUND)"
    mouse_id="$d"
  else
    echo $product
  fi
done

if [ -z "$mouse_id" ]; then
  die "device not foud"
fi

echo "Restarting $mouse_id ($MOUSE_PRODUCT)"
echo " * unbinding"
echo "$mouse_id" > /sys/bus/usb/drivers/usb/unbind
sleep 3
echo " * binding"
echo "$mouse_id" > /sys/bus/usb/drivers/usb/bind

Esse foi o código inicial que usei, mas descobri logo que dar um reset no mouse não era o suficiente.  O mais efetivo era dar um reset no hub USB em que está conectado.  Assim alterei pra usar "USB2.0 Hub".

O resultado:

helio@goosfraba ~> sudo homemadescripts/restart_mouse.sh
Detecting mouse:
 * 1-4: CSR8510 A10
 * 2-5: Lexmark MC3224dwe
 * 5-1: PLAYSTATION(R)3Conteroller
 * 8-1: USB2.0 Hub
 * 8-1.1: HyperX Quadcast
 * 8-1.2: HD Pro Webcam C920
 * 8-1.3: G432 Gaming Headset
 * 8-1.4: USB2.0 Hub
 * 8-1.4.1: Keychron C1
 * 8-1.4.4: G203 Prodigy Gaming Mouse (DEVICE FOUND)
 * 9-1: USB3.0 Hub
 * 9-1.4: USB3.0 Hub
 * usb1: OHCI PCI host controller
 * usb2: EHCI Host Controller
 * usb3: EHCI Host Controller
 * usb4: EHCI Host Controller
 * usb5: OHCI PCI host controller
 * usb6: OHCI PCI host controller
 * usb7: OHCI PCI host controller
 * usb8: xHCI Host Controller
 * usb9: xHCI Host Controller
Restarting 8-1.4 (USB2.0 Hub)
 * unbinding
 * binding

e temos um mouse funcionando :)

O código está no github: https://github.com/helioloureiro/homemadescripts/blob/master/restart_mouse.sh

Automação vs DEVOPS

Details
Written by: Helio Loureiro
Category: Blog
Published: March 19, 2023
Hits: 2665

Participei de um bate papo legal com Fernando Ike e Bruno Rocha, amigos de muitos FISLs, sob a direção de Carlos Nogueira.  O assunto foi automação e devops, com um pouco de contos de "causos", como sempre :)

 

História da LinuxMall em vídeo

Details
Written by: Helio Loureiro
Category: Blog
Published: March 10, 2023
Hits: 3001

Pelo número de acessos ao artigo Fim da LinuxMall? mostra que ela deixou muitas saudades.

O Rodrigo Caetano iniciou uma série de vídeos, que ainda está no primeiro, contando a história da LinuxMall.

Não explica ainda o motivo do fim, mas imagino que isso deva vir com o tempo.

A série é chamada "o desbravador do e-commerce"  e conta bastante do início não somente da LinuxMall mas de todo e-commerce no Brasil.

 

FOSDEM 2023

Details
Written by: Helio Loureiro
Category: Blog
Published: February 10, 2023
Hits: 3686

No último fim de semana aconteceu o FOSDEM, a conferência anual sobre software livre da europa.  Não a única, mas uma das mais antigas e importantes.  E um ponto de encontro pro brazucas, já convertidos ou não pra cidadãos do velho continente.

O ponto de partida é na sexta-feira onde a festa é no Delirium Café, já velho conhecido dos participantes.  E tudo regado à cerveja belga que custa 1/3 do preço na Suécia.

Eu particularmente não tenho nenhuma palestra pra recomendar assistir.  Todas estão disponíveis no site https://fosdem.org.  As que eu vi, achei bem... não algo que valha compartilhar.  Não por serem ruins, mas porque talvez eu mesmo não tivesse o nível técnico pra entender o que descreviam ali.  E pode acreditar que teve muita coisa que não entendi patavinas do que falavam.  Mas eu fiquei transitando ali pelos lados de containers, kernel e palestras no anfiteatro maior do evento, Jansen.  Então perdi muita coisa, porque é uma maratona insana de palestras ao mesmo tempo e às vezes as salas não eram próximas pra uma troca rápida.  De acordo com meu fitib, passei de 25k passos no sábado.

Mas dentro do evento o que vale mesmo são os encontros com as pessoas.  Elas dão dicas de palestras que foram ótimas e você pode assistir depois online.

E o que não dizer da comida nos arredores do evento?  Comi praticamente uma perna de brontossauro no almoço.

No primeiro dia as palestras não estavam tão cheia no começo, mas conforme o dia foi passando, as pessoas acordaram da ressaca e foram pro local do evento na Université Libre de Bruxeles.  As salas lá são impressionantes de grandes.

E os encontros com velhos amigos também foi uma parte boa.  E com ótima comida (que era algo espanhol de acordo com o cardápio).

E claro a menção honrosa à decoração dos mictórios nos banheiros do bar.

Eu aproveitei para dar uma olhadinha no saudoso perl.  Muitos livros da versão 6 ainda.  Melhor esperar pela versão 7.

Mantendo pacote no AUR

Details
Written by: Helio Loureiro
Category: Linux
Published: January 13, 2023
Hits: 2931

Logo que passei a usar o archlinux, que descrevi em A era do Arch Linux, descobri rapidamente que existe um repositório chamado AUR, ArchLinux User Repository.

O AUR é basicamente um respositório de repositórios com código fonte pra criar pacotes pro archlinux criado pros usuários.  Não é preciso criar muito vínculo com o projeto e basta puxar seu pacote lá.

Em um desses dias, durante um upgrade com pacman, apareceu pra mim que um pacote python estava desatualizado, marcado como órfão.  Então decidi arregaçar as mangas pra enviar um patch de atualização pro pacote.

Li a documentação de como gerar os pacotes no archlinux, que é muito, mas muito, muito fácil.  O sistema é fácil pra descomplicar a vida.  É praticamente um Makefile que você configura e bota pra rodar.  E tudo é controlado com git.

Então meio que adotei o pacote e o tenho mantido atualizado desde então: https://aur.archlinux.org/packages/python-pytelegrambotapi

A desburocracia é imensa.  Foi só clonar o repositório, alterar, testar e mandar um push com o update.

O lado ruim da coisa é que qualquer coisa pode ser enviada pra um desses repositórios.  Não há verificação.  Na verdade parte da ideia do AUR é essa mesmo: pouca burocracia, mas você é responsável pelo que usa.  Então é por sua conta e risco pegar pacotes de lá e assume-se que deu uma boa olhada no PKGBUILD, que é a instrução de como o pacote é gerado.  Pra esse pacote do pytelegrambotapi por exemplo o arquivo é esse aqui:  https://aur.archlinux.org/cgit/aur.git/tree/PKGBUILD?h=python-pytelegrambotapi

Só de olhar esse arquivo dá pra perceber o porquê adotei o pacote AUR: é muito fácil manter.  Muito.

Mais um ponto positivo pro archlinux.

E você?  Ainda não migrou pra ele?

  • Ataque em junho de 2022?
  • Análise do site em 2022
  • Google passou a exigir SPF1 configurado no servidor de e-mail
  • E quebrei o linux-br.org
  • 2023 - o ano do Linux no desktop

Page 10 of 39

  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

Estatísticas

  • Users 2
  • Articles 514
  • Articles View Hits 3687714

Imagem aleatória