Rss

  • youtube
  • linkedin
  • google

Archives for : Dezembro2015

Renomeando arquivos usando lista de 0 a Z

Hoje eu estava programando alguns scripts e encontrei um pequeno problema de usar um padrão definido.

O padrão é criar arquivos onde a sequência inicia em 0 (zero) e não pode ser repetido até Z.

Exemplo:

myfile0.ext, myfile1.ext, myfile2.ext, (...), myfile9.ext, myfileA.ext, myfileB.txt, (...), myfileZ.txt

Bem, Isto não é um grande problema, então eu uso esse código.

// Filename
$seq = $last_used_seq = '';
$seqs = array_merge(range('0','9'), range('A', 'Z'));]
$l = 1;
while (!in_array($seq, $seqs)) {
    $seq = chr(ord($last_used_seq) + $l++);
}

Mas

$Seq

Não deu o valor esperado de 0 (zero) na primeira execução. Em vez disso, estava em branco.

As variáveis de depuração, Eu vi que o while Nunca é avaliada como true. A tentativa de reproduzir na linha de comando que vi

in_array($Seq, $PDCs);

sempre retornar true. Eu tentei usar “”, “R” e não importa qual o valor que eu usei, ainda retornando true.

Então eu mudar para usar STRICT argumento para in_array to true and works for ‘;A’; through ‘;Z’;, but not for ‘;0; through ‘;9;.

while (!in_array($seq, $seqs, true)) {
    $seq = chr(ord($last_used_seq) + $l++);
}

Damn…; PHP é certo, ;0; Não é estritamente iguais para 0. O Chr função de retorno string e

gama('0', '9')

Cria um array com integer valores.

Então, Eu mudei a abordagem para avaliar todos os valores com STRICT, Porque eu gostaria de criar um código limpo sem nenhuma outras funções para ser usado.

This is the final code that I’;usando o m:

// $seq de valores iniciais = ';
$PDCs = array_merge(gama(Ord('0'),Ord('9')), gama(Ord('A'), Ord('Z')));
$PDCs = array_map(«chr», $PDCs);
$l = 1;
ao mesmo tempo (!in_array($Seq, $PDCs, true)) {
    $Seq = chr(Ord($infos['last_seq']) + $l + +);
}

// Nomes de arquivo foreach ($itens_for_files as $key =>; $itens) {
    // ... Mais códigos para preencher o arquivo $seq = chr(Ord($Seq) + 1);
    ao mesmo tempo (!in_array($Seq, $PDCs, true)) {
    $Seq = chr(Ord($Seq) + 1);
    $FileName = 'myfile' . $Seq . 'ext';
    // ...
}

Como você pode ver, Eu mudei o $seqs initial values from ‘;0; para seu ASCII código e voltar ao seu valor que me deu um array com todos os valores em string type.

Até mais!

Erro em Comparação PHP

Hoje, Eu estava escrevendo um script em PHP para ser usado na linha de comando, quando me deparei com um comportamento inesperado (pelo menos da minha parte).
O script deve receber três argumentos, o último de uma lista que contém um ou mais códigos numéricos.
Tentando validar este último argumento obtive um resultado diferente do esperado.
Veja o trecho de código que eu estava usando.:

// Test. php se (php_sapi_name() = = 'cli') {
    $di = isset($argv[1]) ? $argv[1] : Data('Y-m-d'); // Inicial data $df = isset($argv[2]) ? $argv[2] : Data('Y-m-d'); // Data final $prods = isset($argv[3]) ? explodir(',', $argv[3]) : matriz(); // Lista de códigos

    ##### Validando
    // Inicial data se ($di != Data('Y-m-d', strtotime($di))) {
        Eco "\n";
        Eco "ERRO! DATA inicial inválida!\n";
        saída;
    }
    // Final data se ($DF != Data('Y-m-d', strtotime($DF))) {
        Eco "\n";
        Eco "ERRO! Data FINAL inválida!\n";
        saída;    
    }

    // Códigos se (contagem($Aguilhões) >; 0) {
        foreach ($agulhadas como $prod) {
            se ($prod != (int)$prod) {
                Eco "\n";
                Eco "ERRO! O código " . $prod . " é inválido!\n" ;
                saída;
            }
        }
    }
    Eco "FEITO!";
}

Continue lendo >>

Como corrigir Data/hora no Centos 6.X para seu timezone inclusive nos logs

Hoje eu me deparei com um problema ao utilizar o Fail2ban que me ajuda demais a manter o servidor no ar mesmo sob ataques de brute-force.

Um dos meus filtros não estavam barrando as diversas tentativas de autenticação em um dos meus serviços embora estivesse tudo certo. Resolvi aumentar o tempo de Findtime na configuração comum e ele começou a barrar.

Então era hora de entender porque com um findtime baixo ele não conseguia barrar. Comecei a checar detalhadamente as configurações e percebi que mesmo tendo alterado a hora para meu timezone para o horario oficial de Brasilia, os logs continuavam a exibir o horario em UTC. Desconfiei que pudesse ser isso e resolvi alterar o horário que é colocado nos logs (/var/log/messages).

Bingo!

Após a alteração e confirmar que os logs estavam usando o mesmo horario que o reportado em

Data 

mudei o findtime para os valores que desejava e tudo funcionou como esperado.

Segue a receita para alterar o horario.

As informações de Timezone ficam no arquivo /etc/localtime e caso ele não esteja no que você quer basta substitui-lo pelo que deseja e que esteja presente em /usr/share/zoneinfo/. No meu caso, como queria o horario de Brasília, utilizei /usr/share/zoneinfo/America/Sao_Paulo.

# ln -sf /usr/share/zoneinfo/America/Sao_Paulo /etc/localtime

Agora é só testar usando o comando date e verificar a saída que deverá ser algo como:

# date Wed Dec 9 15:55:58 BRST 2015

Mesmo após essas mudanças, os logs continuarão a terem o horário da forma antiga. Para alterar isso edite o arquivo /etc/sysconfig/clock e adicione as linhas abaixo para refletir também o seu timezone.

ZONE="America/Sao_Paulo"
UTC=false ARC=false

No meu caso, precisei reiniciar o servidor para que as alterações surtissem efeito mas pode ser que apenas reiniciando o serviço rsyslog já resolva.

# service rsyslog restart

Até a próxima.

Como corrigir erro de LOCALE no Linux Debian/Ubuntu

Hoje precisei olhar os logs de um servidor FTP que roda sob o pure-ftp e percebi que os horários estavam todos em UTC .
Como eu precisava enviar parte dos logs a um terceiro que faz uso dele e não está familiarizado com sistemas, poderia acabar ocorrendo algum mal entendido. Resolvi então que deveria manter os logs de todas as aplicações no fuso horário brasileiro.
De acordo com a documentação do pure-ftp ele utiliza as variáveis de ambiente para determinar qual será o horário incluído nos logs

Continue lendo >>