Alguém quer convites para o chi.mp ? Tenho alguns para oferecer! Vejam o que é aqui: http://chi.mp
Avatar

Bruno Bernardino

Vcard Download vCard   what is this?
Rss_icon

Recent Activity


Filter by:
All
  • bash scripting: watchdog para load, prevenir crashes

    Terminal / Consola

    Muitos SysAdmins (Administradores de Sistemas) deparam-se por vezes com o problema de, por algum motivo (ou um DDoS (Ataque de Negação de Serviço Distribuído), um loop infinito ou mal programado em algum script, etc.), o load de um determinado computador/servidor chega a valores tão altos que o sistema fica praticamente parado, levando a quebras do serviço.

    Uma forma um pouco brusca mas eficaz de evitar esse problema é criar um watchdog que, a partir do momento em que o load chegue a um valor alto (determinado pelo utilizador), reinicia os serviços que normalmente poderão estar a causar problemas.

    Aqui está um pequeno ficheiro em bash scripting (ou shell scripting, como preferirem) que utilizo para fazer isso mesmo.

    Neste caso específico, o processador tem 2 cores, como tal, um load de 2 significa que o processador está a ser utilizado completamente (um load de 1 significaria, neste caso, que o processador estava "a meio", um load de 4 que estaria para processar 2 vezes mais do que a sua capacidade, valor este que vai reduzindo consoante vai processando os pedidos).

    Vou também assumir que o script se encontra em /root/scripts/ e que tenho um script /root/scripts/restart_services que reinicia todos os serviços que considero relevantes.

    Notem que os valores (nomes dos ficheiros / valor máximo de load) podem mudar de servidor para servidor.

    Primeiro, criamos o ficheiro:

    # nano /root/scripts/load_wd.sh

    Agora, cola-se este conteúdo, devidamente editado

    #!/bin/bash

    EMAIL="o.seu.email@qualquercoisa.com" # ALTERAR: O email que vai receber o aviso
    SUBJECT="Load Alert - $(hostname)" # ALTERAR: Assunto do email
    FILE="/root/scripts/load_wd_result" # O ficheiro "temporário" para onde é gravado o que será enviado como email
    MAXVAL=2 # ALTERAR: O valor máximo do load (exclusive)

    LD="$(uptime|awk '{print $(NF-2)}'|cut -d. -f1)"
    if test $LD -gt $MAXVAL
    then
    echo "$(/root/scripts/restart_services)" >> $FILE # ALTERAR: Aqui está o ficheiro/comando que vai ser executado caso se verifique o load excessivo
    mail -s "$SUBJECT" "$EMAIL" < $FILE
    fi

    Para Guardar usa-se "CTRL + O" (confirma-se a escrita com um enter) e para sair "CTRL + X".

    Obviamente não se podem esquecer de tornar o ficheiro executável.

    # chmod 700 /root/scripts/load_wd.sh

    E agora, colocá-lo na crontab, adicionando-lhe a seguinte linha:

    */5 * * * * /root/scripts/load_wd.sh >> /dev/null 2>&1

    Para quem não sabe, para abrir o crontab e editar, é normalmente usado:

    # crontab -e
  • bash scripting: watchdog para load, prevenir crashes

    Terminal / Consola

    Muitos SysAdmins (Administradores de Sistemas) deparam-se por vezes com o problema de, por algum motivo (ou um DDoS (Ataque de Negação de Serviço Distribuído), um loop infinito ou mal programado em algum script, etc.), o load de um determinado computador/servidor chega a valores tão altos que o sistema fica praticamente parado, levando a quebras do serviço.

    Uma forma um pouco brusca mas eficaz de evitar esse problema é criar um watchdog que, a partir do momento em que o load chegue a um valor alto (determinado pelo utilizador), reinicia os serviços que normalmente poderão estar a causar problemas.

    Aqui está um pequeno ficheiro em bash scripting (ou shell scripting, como preferirem) que utilizo para fazer isso mesmo.

    Neste caso específico, o processador tem 2 cores, como tal, um load de 2 significa que o processador está a ser utilizado completamente (um load de 1 significaria, neste caso, que o processador estava "a meio", um load de 4 que estaria para processar 2 vezes mais do que a sua capacidade, valor este que vai reduzindo consoante vai processando os pedidos).

    Vou também assumir que o script se encontra em /root/scripts/ e que tenho um script /root/scripts/restart_services que reinicia todos os serviços que considero relevantes.

    Notem que os valores (nomes dos ficheiros / valor máximo de load) podem mudar de servidor para servidor.

    Primeiro, criamos o ficheiro:

    # nano /root/scripts/load_wd.sh

    Agora, cola-se este conteúdo, devidamente editado

    #!/bin/bash

    EMAIL="o.seu.email@qualquercoisa.com" # ALTERAR: O email que vai receber o aviso
    SUBJECT="Load Alert - $(hostname)" # ALTERAR: Assunto do email
    FILE="/root/scripts/load_wd_result" # O ficheiro "temporário" para onde é gravado o que será enviado como email
    MAXVAL=2 # ALTERAR: O valor máximo do load (exclusive)

    LD="$(uptime|awk '{print $(NF-2)}'|cut -d. -f1)"
    if test $LD -gt $MAXVAL
    then
    echo "$(/root/scripts/restart_services)" >> $FILE # ALTERAR: Aqui está o ficheiro/comando que vai ser executado caso se verifique o load excessivo
    mail -s "$SUBJECT" "$EMAIL" < $FILE
    fi

    Para Guardar usa-se "CTRL + O" (confirma-se a escrita com um enter) e para sair "CTRL + X".

    Obviamente não se podem esquecer de tornar o ficheiro executável.

    # chmod 700 /root/scripts/load_wd.sh

    E agora, colocá-lo na crontab, adicionando-lhe a seguinte linha:

    */5 * * * * /root/scripts/load_wd.sh >> /dev/null 2>&1

    Para quem não sabe, para abrir o crontab e editar, é normalmente usado:

    # crontab -e
  • PHP: Cortar texto em largura, não em caracteres

    Programar PHP

    Bem, já que acabei de publicar o meu novo site pessoal e a nesse contexto o meu próximo passo é melhorar este blog, faz sentido colocar aqui mais e melhor conteúdo.

    O artigo de hoje vai parecer pequeno, mas acredito que vá ajudar muita gente.

    Muitas vezes temos um limite de largura para um título e, como não se usam normalmente fontes mono-espaçadas (qualquer caracter ocupa o mesmo espaço em largura), definir um número de caracteres pode-se tornar falacioso.

    A função que aqui apresento serve para isso mesmo pois, se bem que não é infalível, é bastante precisa com esse tipo de cálculos (a que aqui coloco não suporta muitos caracteres, mas são livres de a adaptar às vossas necessidades).

    <?php
    function cutText($txt,$len=30) {
    $strlen = strlen($txt);

    for ($i=0;$i<strlen($txt);$i++) {
    if ($txt{$i} == '.' || $txt{$i} == ':') $strlen -= 0.5;
    if ($txt{$i} == 'w' || $txt{$i} == '@') $strlen++;
    }

    $strlen = round($strlen);

    if ($strlen > $len) {
    $txt = substr($txt,0,($len-3)).'...';
    }

    return $txt;
    }
    ?>

    Isto é só uma "base" para perceberem esta ideia, que nem sempre será útil, mas sim no caso específico que abordei em cima.

    Como podem perceber, a função conta o número de caracteres, mas caso o caracter a ser analisado seja um ponto ou dois pontos (poderão adicionar vírgulas, espaços, etc., mas quer um quer outro normalmente ocupam mais espaço em largura), o "contador interno" diminui meio caracter, mas caso o caracter seja um w ou uma arroba (caracteres mais largos do que o normal), aí já é "contabilizado" mais um caracter.

  • PHP: Cortar texto em largura, não em caracteres

    Programar PHP

    Bem, já que acabei de publicar o meu novo site pessoal e a nesse contexto o meu próximo passo é melhorar este blog, faz sentido colocar aqui mais e melhor conteúdo.

    O artigo de hoje vai parecer pequeno, mas acredito que vá ajudar muita gente.

    Muitas vezes temos um limite de largura para um título e, como não se usam normalmente fontes mono-espaçadas (qualquer caracter ocupa o mesmo espaço em largura), definir um número de caracteres pode-se tornar falacioso.

    A função que aqui apresento serve para isso mesmo pois, se bem que não é infalível, é bastante precisa com esse tipo de cálculos (a que aqui coloco não suporta muitos caracteres, mas são livres de a adaptar às vossas necessidades).

    <?php
    function cutText($txt,$len=30) {
    $strlen = strlen($txt);

    for ($i=0;$i<strlen($txt);$i++) {
    if ($txt{$i} == '.' || $txt{$i} == ':') $strlen -= 0.5;
    if ($txt{$i} == 'w' || $txt{$i} == '@') $strlen++;
    }

    $strlen = round($strlen);

    if ($strlen > $len) {
    $txt = substr($txt,0,($len-3)).'...';
    }

    return $txt;
    }
    ?>

    Isto é só uma "base" para perceberem esta ideia, que nem sempre será útil, mas sim no caso específico que abordei em cima.

    Como podem perceber, a função conta o número de caracteres, mas caso o caracter a ser analisado seja um ponto ou dois pontos (poderão adicionar vírgulas, espaços, etc., mas quer um quer outro normalmente ocupam mais espaço em largura), o "contador interno" diminui meio caracter, mas caso o caracter seja um w ou uma arroba (caracteres mais largos do que o normal), aí já é "contabilizado" mais um caracter.

  • O Portugal de Sócrates Quase um ano após o meu último artigo que foi praticamente uma cópia (corrigida) de um email que me chegou “ŕs măos”, ganhei coragem para escrever algo mais, se bem que năo é nada de novo. Um desabafo, vá. Pelos vistos, e tendo em conta as declaraçőes do nosso primeiro-ministro Eng.ş José Sócrates, cheguei ŕ conclusăo [...]
  • PHP: Cortar texto com HTML

    Programar PHP

    Hoje apresento-vos uma função que uso para cortar/truncar texto que contém HTML, ou seja, tem por objectivo poder cortar/truncar texto maior que X caracteres, sem contabilizar o HTML como caracteres, evitando assim tags não fechadas ou cortadas a meio.

    Esta função é baseada numa função que arranjei algures na Internet (se souberem onde, coloquem o link para eu referir no artigo) e depois alterei ligeiramente, pelo que os "créditos" da mesma deveriam ir, quase na totalidade, para quem fez a função inicialmente.

    <?php
    function cutHTML($text,$length=100,$ending='...',$cutWords=false,$considerHtml=true) {
    if ($considerHtml) {
    // se o texto for mais curto que $length, retornar o texto na totalidade
    if (strlen(preg_replace('/<.*?>/', '', $text)) <= $length) {
    return $text;
    }

    // separa todas as tags html em linhas pesquisáveis
    preg_match_all('/(<.+?>)?([^<>]*)/s', $text, $lines, PREG_SET_ORDER);

    $total_length = strlen($ending);
    $open_tags = array();
    $truncate = '';

    foreach ($lines as $line_matchings) {
    // se existir uma tag html nesta linha, considerá-la e adicioná-la ao output (sem contar com ela)
    if (!empty($line_matchings[1])) {
    // se for um "elemento vazio" com ou sem barra de auto-fecho xhtml (ex. <br />)
    if (preg_match('/^<(\s*.+?\/\s*|\s*(img|br|input|hr|area|base|basefont|col|frame|isindex|link|meta|param)(\s.+?)?)>$/is', $line_matchings[1])) {
    // não fazer nada
    // se a tag for de fecho (ex. </b>)
    } else if (preg_match('/^<\s*\/([^\s]+?)\s*>$/s', $line_matchings[1], $tag_matchings)) {
    // apagar a tag do array $open_tags
    $pos = array_search($tag_matchings[1], $open_tags);
    if ($pos !== false) {
    unset($open_tags[$pos]);
    }
    // se a tag é uma tag inicial (ex. <b>)
    } else if (preg_match('/^<\s*([^\s>!]+).*?>$/s', $line_matchings[1], $tag_matchings)) {
    // adicionar tag ao início do array $open_tags
    array_unshift($open_tags, strtolower($tag_matchings[1]));
    }
    // adicionar tag html ao texto $truncate
    $truncate .= $line_matchings[1];
    }

    // calcular a largura da parte do texto da linha; considerar entidades como um caracter
    $content_length = strlen(preg_replace('/&[0-9a-z]{2,8};|&#[0-9]{1,7};|&#x[0-9a-f]{1,6};/i', ' ', $line_matchings[2]));
    if ($total_length+$content_length> $length) {
    // o número dos caracteres que faltam
    $left = $length - $total_length;
    $entities_length = 0;
    // pesquisar por entidades html
    if (preg_match_all('/&[0-9a-z]{2,8};|&#[0-9]{1,7};|&#x[0-9a-f]{1,6};/i', $line_matchings[2], $entities, PREG_OFFSET_CAPTURE)) {
    // calcular a largura real de todas as entidades no alcance "legal"
    foreach ($entities[0] as $entity) {
    if ($entity[1]+1-$entities_length <= $left) {
    $left--;
    $entities_length += strlen($entity[0]);
    } else {
    // não existem mais caracteres
    break;
    }
    }
    }
    $truncate .= substr($line_matchings[2], 0, $left+$entities_length);
    // chegamos à largura máxima, por isso saímos do loop
    break;
    } else {
    $truncate .= $line_matchings[2];
    $total_length += $content_length;
    }

    // se chegarmos à largura máxima, saímos do loop
    if($total_length>= $length) {
    break;
    }
    }
    } else {
    if (strlen($text) <= $length) {
    return $text;
    } else {
    $truncate = substr($text, 0, $length - strlen($ending));
    }
    }

    // se as palavras não puderem ser cortadas a meio...
    if (!$cutWords) {
    // ...procurar a última ocorrência de um espaço...
    $spacepos = strrpos($truncate, ' ');
    if (isset($spacepos)) {
    // ...e cortar o texto nesta posição
    $truncate = substr($truncate, 0, $spacepos);
    }
    }

    // adicionar $ending no final do texto
    $truncate .= $ending;

    if($considerHtml) {
    // fechar todas as tags html não fechadas
    foreach ($open_tags as $tag) {
    $truncate .= '</' . $tag . '>';
    }
    }
    return $truncate;
    }
    ?>

    Modo de utilização:

    Como sempre, é bastante simples e intuitivo, segue um exemplo de como truncar um texto $html, que é um texto com HTML.

    <?php
    $html = "Texto com <strong>html</strong>.";
    echo cutHTML($html,10);
    ?>

    Como sempre, é bastante simples e prático.

    De notar que, se $considerHtml = false, estarão a cortar texto de forma normal, tendo a vantagem de considerar cortar (se $cutWords = true) ou não palavras.

  • 22353_470553380022_889130022_10941349_4158075_s Parece um jacto privado! High quality :D
    ~1 year on Facebook
  • 13544_327602015022_889130022_9745759_5233834_s Para saberem do que estou a falar. (e para provar que não estou maluco)
    > 2 years on Facebook
  • PHP: Cortar texto em largura, não em caracteres

    Programar PHP

    Bem, já que acabei de publicar o meu novo site pessoal e a nesse contexto o meu próximo passo é melhorar este blog, faz sentido colocar aqui mais e melhor conteúdo.

    O artigo de hoje vai parecer pequeno, mas acredito que vá ajudar muita gente.

    Muitas vezes temos um limite de largura para um título e, como não se usam normalmente fontes mono-espaçadas (qualquer caracter ocupa o mesmo espaço em largura), definir um número de caracteres pode-se tornar falacioso.

    A função que aqui apresento serve para isso mesmo pois, se bem que não é infalível, é bastante precisa com esse tipo de cálculos (a que aqui coloco não suporta muitos caracteres, mas são livres de a adaptar às vossas necessidades).

    <?php
    function cutText($txt,$len=30) {
    $strlen = strlen($txt);

    for ($i=0;$i<strlen($txt);$i++) {
    if ($txt{$i} == '.' || $txt{$i} == ':') $strlen -= 0.5;
    if ($txt{$i} == 'w' || $txt{$i} == '@') $strlen++;
    }

    $strlen = round($strlen);

    if ($strlen > $len) {
    $txt = substr($txt,0,($len-3)).'...';
    }

    return $txt;
    }
    ?>

    Isto é só uma "base" para perceberem esta ideia, que nem sempre será útil, mas sim no caso específico que abordei em cima.

    Como podem perceber, a função conta o número de caracteres, mas caso o caracter a ser analisado seja um ponto ou dois pontos (poderão adicionar vírgulas, espaços, etc., mas quer um quer outro normalmente ocupam mais espaço em largura), o "contador interno" diminui meio caracter, mas caso o caracter seja um w ou uma arroba (caracteres mais largos do que o normal), aí já é "contabilizado" mais um caracter.

  • bash scripting: watchdog para load, prevenir crashes

    Terminal / Consola

    Muitos SysAdmins (Administradores de Sistemas) deparam-se por vezes com o problema de, por algum motivo (ou um DDoS (Ataque de Negação de Serviço Distribuído), um loop infinito ou mal programado em algum script, etc.), o load de um determinado computador/servidor chega a valores tão altos que o sistema fica praticamente parado, levando a quebras do serviço.

    Uma forma um pouco brusca mas eficaz de evitar esse problema é criar um watchdog que, a partir do momento em que o load chegue a um valor alto (determinado pelo utilizador), reinicia os serviços que normalmente poderão estar a causar problemas.

    Aqui está um pequeno ficheiro em bash scripting (ou shell scripting, como preferirem) que utilizo para fazer isso mesmo.

    Neste caso específico, o processador tem 2 cores, como tal, um load de 2 significa que o processador está a ser utilizado completamente (um load de 1 significaria, neste caso, que o processador estava "a meio", um load de 4 que estaria para processar 2 vezes mais do que a sua capacidade, valor este que vai reduzindo consoante vai processando os pedidos).

    Vou também assumir que o script se encontra em /root/scripts/ e que tenho um script /root/scripts/restart_services que reinicia todos os serviços que considero relevantes.

    Notem que os valores (nomes dos ficheiros / valor máximo de load) podem mudar de servidor para servidor.

    Primeiro, criamos o ficheiro:

    # nano /root/scripts/load_wd.sh

    Agora, cola-se este conteúdo, devidamente editado

    #!/bin/bash

    EMAIL="o.seu.email@qualquercoisa.com" # ALTERAR: O email que vai receber o aviso
    SUBJECT="Load Alert - $(hostname)" # ALTERAR: Assunto do email
    FILE="/root/scripts/load_wd_result" # O ficheiro "temporário" para onde é gravado o que será enviado como email
    MAXVAL=2 # ALTERAR: O valor máximo do load (exclusive)

    LD="$(uptime|awk '{print $(NF-2)}'|cut -d. -f1)"
    if test $LD -gt $MAXVAL
    then
    echo "$(/root/scripts/restart_services)" >> $FILE # ALTERAR: Aqui está o ficheiro/comando que vai ser executado caso se verifique o load excessivo
    mail -s "$SUBJECT" "$EMAIL" < $FILE
    fi

    Para Guardar usa-se "CTRL + O" (confirma-se a escrita com um enter) e para sair "CTRL + X".

    Obviamente não se podem esquecer de tornar o ficheiro executável.

    # chmod 700 /root/scripts/load_wd.sh

    E agora, colocá-lo na crontab, adicionando-lhe a seguinte linha:

    */5 * * * * /root/scripts/load_wd.sh >> /dev/null 2>&1

    Para quem não sabe, para abrir o crontab e editar, é normalmente usado:

    # crontab -e
  • PHP: Definir cookies de forma mais prática

    Programar PHP

    O tempo não tem sido muito, e como tal tem-me custado um pouco actualizar este blog com a frequência que pretendia, mas possivelmente isso mudará para os finais de Setembro.

    Até lá, tentarei não deixar mais de uma semana entre artigos, e que sejam todos de interesse.

    Esta função que hoje vos apresento, serve para definir cookies de forma mais prática.

    Obviamente que pode ser melhorada de várias formas (coloco-a aqui alterada, até porque a uso numa classe, com algumas variáveis definidas por outras classes, como o caminho e URL do cookie, que não são obrigatórios e ficam definidos por defeito de forma a que funcione).

    <?php
    function cook($name,$value,$expire=0,$cfg_url='http://www.brunobernardino.net') {
    $d_expire = time()+86400;//-- Este valor pode ser alterado, corresponde a 1 dia
    $path = '/';
    $domain = '';
    $secure = preg_match('/(https:\/\/)/i',$cfg_url) ? true : false;
    $httponly = true;
    if ($expire == 0) $expire = $d_expire;

    setcookie($name,$value,$expire,$path,$domain,$secure,$httponly);
    }
    ?>

    Isto é só uma "base" para perceberem esta ideia, que nem sempre será útil, mas sim no caso específico que abordei em cima.

    Notem que quando definem um cookie (é criado no browser), não conseguem utilizar o valor a partir do $_COOKIE pois este é recebido do browser, e enquanto não existir uma nova comunicação (um refresh, ou ir para outra página do mesmo domínio), não conseguem utilizar o valor definido pelo cookie na variável $_COOKIE.

    O ideal é fazer um redirect ou refresh depois de definir o cookie.

Next page