domingo, 23 de agosto de 2026

Explicação sobre os "Donos de Objetos" em sua Criação

Tutorial rápido — Create(Owner) em Object Pascal

Em Object Pascal, muitos componentes, incluindo formulários, são criados utilizando o padrão:

```
Objeto := TClasse.Create(Owner);

O parâmetro Owner define o proprietário do componente. Uma das principais responsabilidades do Owner é controlar a destruição automática do objeto.

```

1. Create(Application)

Form2 := TForm2.Create(Application);

Nesse caso:

  • O Owner do formulário é Application.
  • A aplicação será responsável pela sua destruição.
  • O formulário também pode ser destruído antecipadamente usando Free.
Uso comum: formulários que permanecem vinculados ao ciclo de vida da aplicação.

2. Create(Self)

Form2 := TForm2.Create(Self);
Atenção: Self não significa simplesmente "ele mesmo". Em Object Pascal, Self representa a instância atual do objeto.

Por exemplo:

procedure TForm1.Abrir;
begin
  Form2 := TForm2.Create(Self);
end;

Nesse exemplo:

  • Self representa Form1.
  • Portanto, o Owner de Form2 será Form1.
  • Quando Form1 for destruído, Form2 também será destruído automaticamente.

3. Create(nil)

Form2 := TForm2.Create(nil);

Quando o parâmetro é nil, o formulário é criado sem Owner.

  • Nenhum outro objeto será responsável pela sua destruição.
  • O formulário não será destruído automaticamente por um Owner.
  • O código que criou o formulário deve cuidar de sua destruição.

Um padrão comum para um formulário modal é:

Form2 := TForm2.Create(nil);
try
  Form2.ShowModal;
finally
  Form2.Free;
end;
Importante: Create(nil) não significa "na prática, Application". Se o Owner é nil, o objeto realmente não possui proprietário.

4. Application.CreateForm

Application.CreateForm(TForm2, Form2);

CreateForm é um método de TApplication usado para criar formulários.

Conceitualmente, o resultado é semelhante a criar o formulário passando Application como Owner:

Form2 := TForm2.Create(Application);

Portanto, nesse caso, o formulário fica associado ao ciclo de vida da aplicação.

Regra prática

Criação Owner Responsável pela destruição
Create(Application) Application Application
Create(Self) Objeto representado por Self Objeto representado por Self
Create(nil) Nenhum Seu código

Owner não é Parent

Um conceito importante é não confundir Owner com Parent.

Owner

Está relacionado ao gerenciamento do ciclo de vida e destruição dos componentes.

Parent

Está relacionado à hierarquia visual dos controles.

Por exemplo:

Button1.Parent := Panel1;

Nesse caso, Panel1 passa a ser o Parent visual do botão. Isso não significa que Panel1 tenha se tornado automaticamente o Owner do botão.

Resumo

```
  • Owner controla quem será responsável pela destruição automática do componente.
  • Self representa a instância atual do objeto.
  • nil significa que o objeto não possui Owner.
  • Create(nil) não transforma o Owner em Application.
  • Owner e Parent são conceitos diferentes.

A escolha do Owner deve levar em consideração quem deverá controlar o ciclo de vida do objeto criado.

```

Abraços

Terence

sexta-feira, 21 de agosto de 2026

Placa Mãe Gigabyte com Ryzen 5300G, não exibe imagem no boot inicial com cabo HDMI

Recentemente passei por um problema bastante intrigante ao montar e configurar um setup com uma placa-mãe Gigabyte A520M, processador AMD Ryzen 3 5300G (com vídeo integrado Radeon) e um monitor da marca Aitek.

Ao conectar o computador através do cabo HDMI, as imagens iniciais do sistema — como a tela da BIOS/Setup e a logo de carregamento do sistema operacional — simplesmente não apareciam. O monitor ficava sem sinal ou em tela preta e o vídeo só dava ar da sua graça quando o sistema operacional alcançava a tela de Login.

Por outro lado, ao utilizar um cabo VGA analógico antigo, o vídeo funcionava perfeitamente desde o primeiro segundo ao ligar a máquina.

Daria para usar no VGA? Sim, mas...

Seria perfeitamente possível continuar utilizando o cabo VGA. No entanto, o cabo VGA utiliza sinal analógico, o que sujeita a imagem a interferências e limita a fidelidade de cores e nitidez em monitores modernos. Como o objetivo era utilizar a transmissão digital e de melhor qualidade do HDMI, fui atrás da solução.

A Solução: Desabilitar o CSM no BIOS

A raiz do problema estava no modo de legado da placa-mãe. Para resolver o problema definitivamente e ter imagem via HDMI desde o momento em que o botão Power é pressionado, siga o passo a passo:

1. Conecte o cabo VGA temporariamente

Ligue o computador utilizando o cabo VGA para que você consiga visualizar a tela de inicialização e acessar o setup da placa-mãe.

2. Acessar o BIOS do sistema

Ao ligar a máquina, pressione repetidamente a tecla Delete (ou Del) para acessar a BIOS da placa-mãe Gigabyte.

3. Localize a opção de Boot e altere o CSM

Na minha placa, dentro do BIOS, ir até a aba Boot. Procurar pela opção CSM Support (poderia ser Compatibility Support Module) e alterar seu status para Disabled (Desabilitado).

4. Salvar e trocar os cabos

Pressione a tecla F10 para salvar as alterações e sair da BIOS. Desligue o computador, desconecte o cabo VGA, conecte o cabo HDMI e ligue a máquina novamente.

Voilà! A imagem da logo da Gigabyte e da BIOS passou a exibir normalmente via HDMI desde o primeiro segundo.

Por que isso acontece?

💡 Entendendo a parte técnica (UEFI vs CSM - explicação dada pela IA do Google):
O CSM (Compatibility Support Module) é um componente do firmware da placa-mãe que emula o antigo sistema BIOS (Legacy) para manter compatibilidade com sistemas operacionais e placas mais antigas.

Ao desabilitar o CSM, a placa-mãe é forçada a rodar em modo UEFI puro. Nesse modo, a firmware carrega nativamente os drivers gráficos digitais UEFI (GOP - Graphics Output Protocol), inicializando saídas de vídeo digitais de alta resolução (como HDMI e DisplayPort) imediatamente no boot, sem depender das rotinas analógicas legadas (VGA).
⚠️ Atenção antes de desabilitar o CSM:
Para que o sistema operacional inicie corretamente em modo UEFI puro (com CSM desabilitado), o seu disco de boot (SSD/HD) precisa estar formatado no esquema de partição GPT. Se o disco estiver no formato antigo MBR, o sistema não vai encontrar o boot até que a tabela de partição seja convertida.

Conclusão

Se você está enfrentando tela preta na inicialização ao usar saídas digitais em processadores Ryzen com vídeo integrado ou placas de vídeo modernas, verificar o estado do suporte a CSM na BIOS é o primeiro passo. É uma configuração simples que garante o funcionamento correto das conexões digitais modernas.

Espero ter ajudado.

Abraços a todos

quinta-feira, 30 de julho de 2026

Importância da escolha do Character Set e Collation no Firebird e MariaDB

Um dos erros mais comuns e com maior potencial de dor de cabeça na modelagem de um banco de dados é negligenciar a escolha do Character Set e do Collation no momento de sua criação. Ajustar isso tardiamente em um banco de produção exige migrações complexas, reindexação de tabelas e pode quebrar consultas já existentes.

Neste artigo, vamos entender a fundo o papel de cada um desses conceitos e ver como configurá-los corretamente no Firebird e no MariaDB.

1. Desmistificando: Character Set vs. Collation

💡 Em resumo:
Character Set (Conjunto de Caracteres): Determina quais símbolos e letras o banco é capaz de armazenar e quantos bytes cada caractere consome.
Collation (Colação / Ordenação): Determina como esses caracteres são comparados, ordenados e pesquisados em cláusulas como WHERE, ORDER BY e GROUP BY.

O Character Set (Armazenamento)

Cada caractere armazenado precisa ser traduzido em bytes no disco. Se você escolher um conjunto limitado como o ASCII clássico, não conseguirá guardar acentos (á, ç, õ). Se escolher ISO8859_1 ou WIN1252 (comuns em legado), conseguirá armazenar o português, mas falhará ao tentar salvar símbolos em grego, cirílico ou emojis.

Atualmente, o padrão recomendado mundialmente é o UTF-8 (no MariaDB/MySQL conhecido como utf8mb4 e no Firebird como UTF8), pois ele aceita qualquer caractere do planeta.

O Collation (Regras de Comparação)

O Collation define o comportamento do banco em buscas de texto. Por exemplo:

  • Jose é igual a jose? (Diferenciação de Maiúsculas/Minúsculas)
  • Jose é igual a José? (Diferenciação de Acentuação)

No MariaDB e em outros bancos relacionais, os nomes das collations frequentemente trazem sufixos que explicam esse comportamento:

  • _ci (Case Insensitive): Não diferencia maiúsculas de minúsculas. Ex: 'MARIA' = 'maria'.
  • _cs (Case Sensitive): Diferencia maiúsculas de minúsculas. Ex: 'MARIA' ≠ 'maria'.
  • _ai (Accent Insensitive): Não diferencia acentos. Ex: 'João' = 'Joao'.
  • _bin (Binary): Compara byte a byte estritamente (máximo desempenho, mas diferencia tudo).

2. Definição em Níveis de Hierarquia

Tanto no MariaDB quanto no Firebird, você pode definir essas configurações em três níveis:

  1. Nível de Banco de Dados: O padrão herdado por novas tabelas.
  2. Nível de Tabela: O padrão para os campos daquela tabela específica.
  3. Nível de Coluna: Substitui a regra da tabela para um campo individual (útil para chaves de integração, hashes MD5/SHA, etc.).

3. Exemplos Práticos no MariaDB

Criação do Banco de Dados

Recomendado para suporte completo a Unicode e emojis no MariaDB:

CREATE DATABASE sistema_db
  CHARACTER SET utf8mb4
  COLLATE utf8mb4_unicode_ci;

Tabela com Exceção na Coluna

Note como a coluna hash_senha utiliza um collation binário para comparações exatas e performance:

CREATE TABLE usuarios (
  id INT AUTO_INCREMENT PRIMARY KEY,
  nome VARCHAR(100), -- Herda utf8mb4 / utf8mb4_unicode_ci do banco
  codigo_iso VARCHAR(10) CHARACTER SET latin1 COLLATE latin1_general_cs,
  hash_senha VARCHAR(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin
) ENGINE=InnoDB;

4. Exemplos Práticos no Firebird

Criação do Banco de Dados

Para suporte a acentuação do português do Brasil com compatibilidade UTF-8:

-- Opção com UTF8 (Moderna e recomendada)
CREATE DATABASE '/caminho/banco.fdb'
  DEFAULT CHARACTER SET UTF8
  COLLATION PT_BR;

-- Opção legada em ISO8859_1 (Caso utilize sistemas legados como Delphi antigo/VCL)
CREATE DATABASE '/caminho/banco_legado.fdb'
  DEFAULT CHARACTER SET ISO8859_1
  COLLATION PT_BR;

Tabela com Coluna Customizada

CREATE TABLE CLIENTES (
  ID INT NOT NULL PRIMARY KEY,
  NOME VARCHAR(100), -- Herda do banco
  SIGLA_ESTADO VARCHAR(2) CHARACTER SET WIN1252
);

5. O Impacto Direto no Desempenho e Armazenamento

A escolha incorreta pode afetar a saúde e o tempo de resposta do servidor de banco de dados:

Fator Single-Byte (ex: ISO8859_1 / Latin1) Multi-Byte (ex: UTF-8 / utf8mb4)
Espaço em Disco 1 byte por caractere fixo. 1 a 4 bytes por caractere (variável).
Uso de Memória/Índices Menor consumo em índices de texto. Índices ocupam mais espaço na RAM e em disco.
Indexação Mais simples de calcular ordens. Regras complexas de ordenação exigem mais CPU.
Compatibilidade Limitada a regiões geográficas. Universal (Sistemas Web, APIs REST, JSON).
⚠️ Cuidado com conversões implícitas (Cast):
Fazer um JOIN entre duas tabelas onde as colunas envolvidas possuem Character Sets ou Collations diferentes faz com que o banco de dados ignore os índices e realize a conversão em memória para cada linha lida (type coercion), o que pode deixar consultas centenas de vezes mais lentas.

Conclusão

Para novas aplicações web e desktop modernas, prefira sempre o padrão UTF-8 (com utf8mb4 no MariaDB e UTF8 no Firebird) utilizando collations insensíveis a maiúsculas/acentos para campos de busca de usuários (como PT_BR ou unicode_ci). Guardar dados com o charset adequado garante a integridade da sua informação e evita gargalos de desempenho difíceis de rastrear no futuro.

Compactação / Descompactação

Trabalhar com o terminal Linux exige dominar a manipulação de arquivos compactados. Se você já se deparou com extensões como .tar.gz, .tar.xz, .7z ou .bz2 e ficou em dúvida sobre qual comando utilizar para compactar ou extrair os dados, este guia completo vai resolver seu problema de vez.

💡 Entendendo a diferença: Arquivar vs. Compactar
No Linux, ferramentas como o tar apenas juntam múltiplos arquivos em um único pacote (arquivamento). Já algoritmos como gzip, bzip2 e xz fazem a compressão (redução de tamanho). Por isso é tão comum ver extensões combinadas como .tar.gz!

Guia Rápido de Referência

Para quem busca agilidade, confira a tabela com os comandos mais comuns do dia a dia:

Extensão Comando para Compactar Comando para Descompactar
.tar.gz / .tgz tar -czvf arq.tar.gz pasta/ tar -xzvf arq.tar.gz
.tar.bz2 / .tbz2 tar -cjvf arq.tar.bz2 pasta/ tar -xjvf arq.tar.bz2
.tar.xz tar -cJvf arq.tar.xz pasta/ tar -xJvf arq.tar.xz
.zip zip -r arq.zip pasta/ unzip arq.zip
.7z 7z a arq.7z pasta/ 7z x arq.7z
.rar rar a arq.rar pasta/ unrar x arq.rar

Detalhamento de cada formato

1. O utilitário TAR (Sem compressão)

Cria um único pacote sem reduzir o tamanho dos arquivos.

# Compactar (Arquivar):
tar -cvf arquivo.tar /caminho/da/pasta

# Descompactar:
tar -xvf arquivo.tar

2. Formatos GZIP (.gz, .tar.gz, .tgz)

É o formato mais tradicional no ecossistema Unix. Rápido e com boa taxa de compressão.

# Arquivo simples (.gz)
gzip arquivo.txt             # Compacta (gera arquivo.txt.gz)
gunzip arquivo.txt.gz        # Descompacta

# Tarball comprimido (.tar.gz ou .tgz)
tar -czvf arquivo.tar.gz pasta/    # Compactar
tar -xzvf arquivo.tar.gz          # Descompactar

3. Formatos BZIP2 (.bz2, .tar.bz2, .tbz2)

Oferece uma taxa de compressão maior que o GZIP, porém consome um pouco mais de processamento.

# Arquivo simples (.bz2)
bzip2 arquivo.txt            # Compacta (gera arquivo.txt.bz2)
bunzip2 arquivo.txt.bz2      # Descompacta

# Tarball comprimido (.tar.bz2 ou .tbz2)
tar -cjvf arquivo.tar.bz2 pasta/   # Compactar
tar -xjvf arquivo.tar.bz2         # Descompactar

4. Formatos XZ e LZMA (.xz, .lzma, .tar.xz)

Ideal para distribuição de código e arquivos grandes. Garante taxas de compressão altíssimas (usado no código-fonte do Kernel Linux).

# Arquivo simples (.xz e .lzma)
xz arquivo.txt               # Compacta .xz
unxz arquivo.txt.xz          # Descompacta .xz

lzma arquivo.txt             # Compacta .lzma
unlzma arquivo.txt.lzma      # Descompacta .lzma

# Tarball comprimido (.tar.xz)
tar -cJvf arquivo.tar.xz pasta/    # Compactar
tar -xJvf arquivo.tar.xz          # Descompactar

5. Formato ZIP (.zip)

Muito utilizado para manter compatibilidade com o Windows.

# Compactar (o parâmetro -r compacta pastas recursivamente):
zip -r arquivo.zip pasta/

# Descompactar:
unzip arquivo.zip

6. Formato 7-Zip (.7z)

Excelente taxa de compressão e suporte a criptografia forte.

# Compactar:
7z a arquivo.7z pasta/

# Descompactar (mantendo a estrutura de pastas original):
7z x arquivo.7z

7. Formatos RAR e Unix Z (.rar e .Z)

Formatos menos comuns nativamente no Linux, mas frequentemente encontrados para download.

# Formato .rar
rar a arquivo.rar pasta/     # Compactar
unrar x arquivo.rar          # Descompactar

# Formato antigo Unix (.Z)
compress arquivo.txt         # Compacta
uncompress arquivo.Z         # Descompacta
# Ou para arquivos .tar.Z:
tar -xZvf arquivo.tar.Z

Download e Extração Direta (Sem salvar em disco)

É possível realizar o download e a extração imediata de arquivos nos formatos tar, tar.gz e tar.bz2 diretamente via terminal, sem a necessidade de salvar o arquivo compactado no disco local. Isso economiza espaço em disco e acelera o processo.

Exemplos com `wget`:

wget http://example.com/archive.tar -O - | tar -x
wget http://example.com/archive.tar.gz -O - | tar -xz
wget http://example.com/archive.tar.bz2 -O - | tar -xj

A diretiva -O - indica que o comando wget deve enviar o conteúdo baixado para a saída padrão (stdout), que por sua vez é redirecionada através de um pipe (|) para o comando tar. Desta forma, em vez de ser gravado em disco, o arquivo é automaticamente expandido em tempo real.

Exemplos com `curl`:

Podemos obter o mesmo resultado utilizando o utilitário curl:

curl http://example.com/archive.tar | tar -x
curl http://example.com/archive.tar.gz | tar -xz
curl http://example.com/archive.tar.bz2 | tar -xj

A diretiva -x do comando tar, em ambos os casos, realiza a extração dos arquivos. As opções complementares (-z para arquivos .gz/gzip e -j para arquivos .bz2/bzip2) realizam a descompactação do fluxo de dados antes de expandir a estrutura do tar.

⚠️ Pré-requisitos de Instalação:
Alguns utilitários como unzip, p7zip e unrar podem não vir instalados por padrão na sua distribuição. Caso algum comando falhe, instale os pacotes via terminal:
sudo apt install zip unzip p7zip-full unrar xz-utils (Debian/Ubuntu) ou
sudo dnf install zip unzip p7zip p7zip-plugins unrar xz (Fedora/RHEL)

Dica Bônus: O truque definitivo com `tar`

Nas versões modernas do utilitário tar, você não precisa memorizar a letra do tipo de compressão (z, j, J) para extrair arquivos! O tar consegue identificar o algoritmo de compressão automaticamente.

Você pode descompactar qualquer pacote .tar.gz, .tar.bz2 ou .tar.xz usando simplesmente:

tar -xvf nome-do-arquivo.tar.*

Conclusão

Guardar essa referência vai te poupar bastante tempo no terminal. Para a maioria das rotinas de servidores e desenvolvimento no Linux, focar nos comandos tar e zip — somado às técnicas de transmissão direta via pipe — cobrirá praticamente todas as suas necessidades diárias.

terça-feira, 28 de julho de 2026

Corrigindo o Erro do chrome-sandbox no Linux (Antigravity, Kiro, Cursor e Electron)

Se você utiliza Linux e tentou rodar programas como Google Antigravity, Kiro IDE, Cursor ou VS Code após descompactar manualmente o arquivo (como .tar.gz), provavelmente se deparou com o seguinte erro no terminal:

FATAL:setuid_sandbox_host.cc(158)] The SUID sandbox helper binary was found, but is not configured correctly.
You need to make sure that /path/to/chrome-sandbox is owned by root and has mode 4755.

Esse erro impede que o aplicativo abra. Veja abaixo o porquê isso ocorre e como resolver em poucos segundos.

Por que esse erro acontece?

Esses editores são desenvolvidos sobre o Electron, que utiliza o motor do Chromium. Para proteger o seu sistema contra códigos maliciosos, o Chromium utiliza um recurso de isolamento (sandbox).

No Linux, para que o arquivo chrome-sandbox funcione corretamente, ele precisa ser de propriedade do usuário root e possuir a permissão especial SUID (4755). Quando baixamos o app compactado e extraímos com nosso usuário comum, ele perde essa permissão especial.

Passo a Passo para Resolver

Siga os comandos abaixo no terminal para ajustar o arquivo da sua aplicação:

1. Acesse a pasta do aplicativo

Navegue até onde você extraiu a pasta do programa (exemplo do Antigravity ou Kiro):

cd /caminho/da/pasta/do/app/

2. Mude o proprietário do arquivo para root

sudo chown root:root chrome-sandbox

3. Aplique a permissão 4755

sudo chmod 4755 chrome-sandbox

4. Teste e confirme

Verifique se as permissões foram alteradas corretamente executando:

ls -l chrome-sandbox

O resultado deve exibir algo como -rwsr-xr-x 1 root root (repare na letra s em rws).

⚠️ Evite usar --no-sandbox:
Muitos tutoriais sugerem rodar o programa com a flag --no-sandbox. Embora funcione, isso desativa a segurança do aplicativo. Sempre dê preferência ao método dos comandos acima.

Solução Global (Opcional)

Em distros mais recentes (Ubuntu 24.04+, Debian 12+), você também pode permitir que o kernel crie sandboxes sem exigir privilégios SUID executando:

sudo sysctl -w kernel.unprivileged_userns_clone=1