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.
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:
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:
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
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.
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
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 :)
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.
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.
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?
Hoje estava olhando pro gráficos anuais de performance da VM quando vi a imagem acima. Parece ataque. Tem cara de ataque mas... não achei nada que tivesse relacionado.
Tem algo na parte de firewall:
Mas é só isso.
Não tem tráfego no Apache:
O pico no final do ano fui em fazendo upgrade. Mas só. Os outros gráficos de CPU, load average, etc não mostram nada.
Não sei se isso me deixa feliz ou triste. Por um lado estou feliz de estar de pé sem precisar mexer em nada por outro lado... o que será que foi atacado?
No momento sigo chorrindo.
Nota: as configurações que seguram o site e tudo mais em pé são as descritas em O dia em que sofri um ataque de DDoS.
E como foi o tráfego por aqui em 2022?
Sem muitas surpresas eu diria. Um tráfego baixo e mais ou menos constante com o passar do tempo.
Qual sistema operacional?
Windows continua sendo a maioria isolada. Mas os demais somados já são mais da metade. Então existe alguma esperança pra humanidade. Ainda que pouca.
E navegadores? Acho que essa vai sem grandes surpresas.
Chrome com larga marge à frente. Firefox e safari empatados. Edge mostrando que por enquanto continua longe de ser usado de verdade.
E vamos pro mobile.
Mesmo Android sendo uns 85% do mercado mobile, teve bastante gente em iOS acessando o site. Interessante.
E sem surpresas pra origem dos acessos. Brazil é líder isolado. Seria estranho não ser uma vez que só escreve em português por aqui.
Das páginas mais lidas, a surpresa foram Fim da LinuxMall? e Brasil: a terra em que malandro é malandro, mané é mané. Provavelmente essa última foi por conta da mesma empresa estar novamente aplicando golpes.
E quem fez referências ao site?
A maioria foi de busca direto pelo Google. Alguns via twiiter (o t.co) e alguns poucos de facebook e duckduckgo. Menção honrosa ao Bing.
E o que buscaram por aqui?
Alguns devem ter sido pela divulgação de links que fiz no Twitter, que agora abandonei pelo Mastodon.
As redes sociais que apontaram pra mim tiveram Twitter como grande campeão, mas era onde eu fazia mais anúncios dos posts. Esse lugar deve ser tomado pelo Mastodon em 2023 uma vez que Twitter virou abandonware pra mim.
Isso irá impactar no acesso ao site? Acho que não. Muita gente vem por busca orgânica.
E mesmo com mudança de template, upgrade de joomla, eu consegui dessa vez não perder tráfego. Isso foi bom.
E que comece 2023!
Hoje, tentando baixar um substituto pro Disqus no Linux-BR, descobri que meus e-mails pra @hl.eng.br não estavam mais funcionando.
Então fui fuçar nos logs do postfix pra ver a razão.
Jan 3 13:22:02 truta postfix/smtp[1984]: B300F11F304: to=, orig_to=<***** AT hl.eng.br>, relay=aspmx.l.google.com[2607:f8b0:4001:c58::1b]:25, delay=13, delays=12/0.01/0.64/0.57, dsn=5.7.1, status=bounced (host aspmx.l.google.com[2607:f8b0:4001:c58::1b] said: 550-5.7.1 [2605:2700:0:17:a800:ff:fe3e:bc97] Our system has detected that this 550-5.7.1 message does not meet IPv6 sending guidelines regarding PTR records 550-5.7.1 and authentication. Please review 550-5.7.1 https://support.google.com/mail/?p=IPv6AuthError for more information 550 5.7.1 . z23-20020a056638001700b00358317a21c3si22106554jao.145 - gsmtp (in reply to end of DATA command))
tl;dr: Google passou a exigir configuração de SPF desde novembro de 2022. Então já desde essa época que nada funciona.
O motivo, claro, é que recebo tudo no servidor onde está o blog e envio pra minha conta loureiro.eng.br que fica no Google.
Nada como começar o ano olhando alguns logs.
Page 4 of 33