Script para normalizar contatos para o Office 365

Fiz esse script para juntar arquivos de contatos (*.csv) e deixar pronto para envio para o Office 365, ele corrige erros de codificação e também corrige o erro “Nome não está disponível”. Para executá-lo, salve em um arquivo script.php, baixe o PHP 8.3 e rode:

php -q script.php

<?php

$arquivoSaida = 'contatos_final_unificado.csv';
$primeiroArquivo = true;
$emailsProcessados = [];

$fpOut = fopen($arquivoSaida, 'w');

// BOM para Office 365
fprintf($fpOut, chr(0xEF).chr(0xBB).chr(0xBF));

$arquivos = glob("./*.csv");

function ultraFix($text) {
    if (empty($text)) return "";

    // 1. Dicionário de Prioridade (Trata primeiro os erros MAIS LONGOS)
    $map = [
        // Erros Triplos (ex: ACESSOCAR)
        'Ç' => 'Ç', 'ç' => 'ç', 'ã' => 'ã', 'õ' => 'õ',
        'á' => 'á', 'é' => 'é', 'í' => 'í', 'ó' => 'ó',
        'ú' => 'ú', 'â' => 'â', 'ê' => 'ê', 'ô' => 'ô',
        
        // Erros de codificação que você enviou por último (ex: Tradição)
        'çã' => 'ção', 'ç' => 'ç', 'ã' => 'ã', 'ó' => 'ó', 
        'é' => 'é', 'á' => 'á', 'í' => 'í', 'õ' => 'õ',
        'â' => 'â', 'ê' => 'ê', 'ô' => 'ô', 'ú' => 'ú',
        'Ç' => 'Ç', 'À' => 'À',
        
        // Padrões residuais de caracteres corrompidos por navegadores/sistemas
        'Ã?â?¡' => 'Ç', 'Ã?§' => 'ç', 'Ã?£' => 'ã'
    ];

    // Executa a substituição baseada no mapa acima
    $text = str_replace(array_keys($map), array_values($map), $text);
    
    // 2. Tenta uma conversão final caso ainda existam bytes de ISO-8859-1 escondidos
    // Mas apenas se ainda houver o caractere 'Ã' seguido de algo, indicando erro
    if (strpos($text, 'Ã') !== false) {
        $attempt = @mb_convert_encoding($text, 'UTF-8', 'ISO-8859-1');
        if (mb_check_encoding($attempt, 'UTF-8')) {
            $text = $attempt;
        }
    }

    return trim(preg_replace('/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]/', '', $text));
}

foreach ($arquivos as $arquivo) {
    if (basename($arquivo) == $arquivoSaida || strpos($arquivo, '.php') !== false) continue;

    if (($handle = fopen($arquivo, "r")) !== FALSE) {
        $cabecalho = fgetcsv($handle);

        if ($primeiroArquivo && $cabecalho) {
            fputcsv($fpOut, $cabecalho);
            $primeiroArquivo = false;
        }

        while (($data = fgetcsv($handle)) !== FALSE) {
            $linha = array_map('ultraFix', $data);
            
            // Pega o Display Name (5) e o E-mail (9 ou 25)
            $displayName = $linha[5] ?? '';
            $email = !empty($linha[9]) ? $linha[9] : ($linha[25] ?? '');

            // Se o nome estiver vazio, usa o e-mail como emergência
            if (empty($displayName)) {
                $displayName = $email;
            }

            // COPIA Display Name para First Name (índice 1)
            $linha[5] = $displayName;
            $linha[1] = $displayName;

            // Filtro de Duplicados
            if (!empty($email)) {
                if (isset($emailsProcessados[$email])) continue;
                $emailsProcessados[$email] = true;
            }

            fputcsv($fpOut, $linha);
        }
        fclose($handle);
    }
}

fclose($fpOut);
echo "Arquivo unificado com sucesso e pronto para o OFFICE 365!\n";

ZeosDBO – Erro “0 record(s) updated. Only one record should have been updated”

Muitas pessoas me enviam questionamentos sobre esse erro causado pelo ZeosDBO, principalmente quando trabalhamos com objetos “table” ao invés de querys.

No desenvolvimento do ZeosDBO muitas coisas ficaram para trás, entre elas, uma exceção criada (sabe-se lá porque motivo) que deveria ser habilitada somente quando a variável global WITH_VALIDATE_UPDATE_COUNT estivesse presente.

Com isso, todas vezes que você abre um registro com “TableObject.Edit” e não faz nenhuma alteração nos campos deste registro, a exceção é acionada com a mensagem “0 record(s) updated. Only one record should have been updated“.

Para remover esta exceção você precisa editar dois arquivos, o src\component\ZSQLUpdate.pas e o

No arquivo src\component\ZSQLUpdate.pas, na linha 829 remova o bloco abaixo selecionado.

No arquivo src\dbc\ZDbcGenericResolver.pas você deve editar na linha 872 e também remover o código selecionado.

Depois, é necessário recompilar, construir (build) e reinstalar o ZeosDBO no seu Delphi.

WP – Compactar HTML

Esta rotina eu utilizava até hoje no site da PARKEER para compactar o HTML a ser exibido pelo WordPress. Embora não tenha maiores aprimoramentos, funciona muito bem.

[code]

function start_ob() {
ob_start(‘pk_compress_html’);
}
function end_ob() {
ob_end_flush();
}

function pk_compress_html($output) {

$search = array(
‘/\>[^\S ]+/s’,     // strip whitespaces after tags, except space
‘/[^\S ]+\</s’,     // strip whitespaces before tags, except space
‘/(\s)+/s’,         // shorten multiple whitespace sequences
‘/<!–(.|\s)*?–>/’ // Remove HTML comments
);
$replace = array(
‘>’,
‘<‘,
‘\\1’,

);
$output = preg_replace($search, $replace, $output);

$output = trim($output);
$output = preg_replace(‘/^[ \t]*[\r\n]+/m’, ”, $output);
return $output;
}
add_action(‘get_header’, ‘start_ob’);
add_action(‘shutdown’, ‘end_ob’, 999);
[code]

Instalando o JDK e o JRE no CentOS / Fedora

Vá até uma pasta livre…

$> cd /opt

Download para OS 32 Bits:

$> wget --no-cookies --no-check-certificate --header "Cookie: gpw_e24=http%3A%2F%2Fwww.oracle.com%2F; oraclelicense=accept-securebackup-cookie" "http://download.oracle.com/otn-pub/java/jdk/8u45-b14/jdk-8u45-linux-i586.rpm"
$> wget --no-cookies --no-check-certificate --header "Cookie: gpw_e24=http%3A%2F%2Fwww.oracle.com%2F; oraclelicense=accept-securebackup-cookie" "http://download.oracle.com/otn-pub/java/jdk/8u45-b14/jre-8u45-linux-i586.rpm"

Download para OS 64 Bits:

$> wget --no-cookies --no-check-certificate --header "Cookie: gpw_e24=http%3A%2F%2Fwww.oracle.com%2F; oraclelicense=accept-securebackup-cookie" "http://download.oracle.com/otn-pub/java/jdk/8u45-b14/jdk-8u45-linux-x64.rpm"
$> wget --no-cookies --no-check-certificate --header "Cookie: gpw_e24=http%3A%2F%2Fwww.oracle.com%2F; oraclelicense=accept-securebackup-cookie" "http://download.oracle.com/otn-pub/java/jdk/8u45-b14/jre-8u45-linux-x64.rpm"

Instalação (via RPM) para o OS 32 Bits:

$> rpm -Uvh jdk-8u45-linux-i586.rpm
$> rpm -Uvh jre-8u45-linux-i586.rpm

Instalação (via RPM) para o OS 64 Bits:

$> rpm -Uvh jdk-8u45-linux-x64.rpm
$> rpm -Uvh jre-8u45-linux-x64.rpm

Só correr para o abraço!

$> java -version
$> javac -version

Como gerar uma chave CSR (SSL)

Se você deseja obter um certificado SSL de uma autoridade certificadora (CA), você precisa gerar primeiro, uma chave de requisição (CSR). O CSR consiste de um par de chaves públicas, além de algumas informações à serem adicionadas ao certificado, como por exemplo, as informações da sua empresa.

Para gerar uma requisição de certificado (chave de requisição), é necessário que você tenha acesso ao terminal do seu servidor, lá, digite o seguinte:

$> openssl genrsa -out domain.key 2048
$> openssl req -new -sha256 -key domain.key -out domain.csr

Algumas informações serão perguntadas, preencha como a seguir:

Wrap text in jQuery

function wrapText(elementID, openTag, closeTag) {
var textArea = $('#' + elementID);
var len = textArea.val().length;
var start = textArea[0].selectionStart;
var end = textArea[0].selectionEnd;
var selectedText = textArea.val().substring(start, end);
var replacement = openTag + selectedText + closeTag;
textArea.val(textArea.val().substring(0, start) + replacement + textArea.val().substring(end, len));
}