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
  • 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 [...]
    ~1 month on
    O Nosso Portugal
  • 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
    5 months on Facebook
  • 13544_327602015022_889130022_9745759_5233834_s Para saberem do que estou a falar. (e para provar que não estou maluco)
    8 months 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.

  • Web: Qual a utilidade para o Twitter

    Twitter

    Com este artigo pretendo explicar várias utilidades para o Twitter, visto que ainda muita gente me pergunta o que é e para que serve.

    Como a resposta para essa pergunta é demasiado comprida e complexa, decidi escrever um artigo sobre a minha perspectiva das várias utilidades para o Twitter, se bem que, certamente, existirão muitas mais, felizmente.

    Publicidade

    Obviamente, um dos usos "comerciais" mais óbvios é a publicidade, ou seja, pode utilizá-lo para divulgar algum produto, serviço, promoção/desconto, etc.

    Um exemplo bem sucedido foi a Dell que conseguiu vender milhões de computadores com promoções para quem os seguia no Twitter. (Ref. http://blogs.zdnet.com/BTL/?p=19696)

    Actualidades / Novidades

    Um dos usos mais comuns para quem não gosta de partilhar aspectos privados da sua vida, é utilizar o Twitter quase como que um agregador de feeds, ou seja, seguem utilizadores importantes (televisões, jornais, etc.) e ficam a par das últimas notícias em "tempo real".

    Debate

    O Twitter pode também ser considerado quase como que um IM (Instant Messenger), tal qual MSN (agora Windows Live Messenger), mas com a diferença em que temos os "contactos" de todos os "famosos" que têm uma conta.

    Isto incentiva-nos a participar em debates, a partilhar ideias, até a enviar uma simples mensagem de apreço por alguém que, por alguma razão, admiramos.

    Por exemplo, nunca pensei na minha vida trocar ideias (palavras, vá) com o Nuno Markl, por mais insignificantes e vazias de sentido que fossem.

    É óbvio que ele tem o blog, mas é mais impessoal.

    Com o Twitter aconteceu, assim como com outras pessoas "famosas" como a Alberta Marques Fernandes, entre outros jornalistas e personalidades de várias áreas.

    Conversas que, de outra forma, não teriam (ou dificilmente teriam) acontecido.

    Feedback

    Esta utilidade é semelhante à anterior, mas mais direccionada para a vertente comercial.

    Imaginem os utilizadores a darem feedback instantâneo sobre um produto ou serviço de que usufruíram.

    Agora notem que mais pessoas vão ver esse feedback e, muito provavelmente, experimentar o produto e dar também eles feedback.

    Aconteceu-me com a ferramenta que utilizo para o Twitter, o HootSuite, pois encontrei uns bugs, disse-lhes quais eram, pouco tempo depois corrigiram, entretanto falei bem do produto (a experiência que tenho com ele é fabulosa), e outras pessoas experimentaram e deram o seu feedback, etc.

    Acho que conseguem imaginar a que me refiro.

    Uma das formas que se imagina o Twitter a ganhar dinheiro é a vender o acesso a estatísticas que se possam construir com a sua base de dados.

    Banalidades (ou não)

    O que foi chamado como o tweet sobre "nada" (por quem, obviamente, não percebe nada do assunto), ou seja, quando dizemos que vamos a algum lado, que experimentamos algo e qual a nossa opinião, até coisas tão "simples" como "bem, vou até à praia".

    Este uso foi o inicial sugerido pelo próprio Twitter, ou seja, basicamente, o que escrevemos naquele pequeno espaço de 140 caracteres é a resposta à pergunta "O que estás a fazer" ("What are you doing?"), com o objectivo de manter os nossos amigos actualizados sobre onde andamos e a fazer o quê.

    Confesso que este último uso, é simultaneamente péssimo e espectacular.

    Por um lado, promove a (já existente em abundância) banalidade das conversas e a sobre-exposição das vidas privadas na Internet, mas por outro, torna também a Internet e a comunicação entre pessoas mais fácil, instantânea, prática e rápida.

    Se algum uso popularizou o Twitter entre pessoas (que são, na realidade, quem mais usa e promove as redes sociais), foi este último. O "stay in touch".

    Eu? Como utilizo?

    Pessoalmente, penso que tenho a minha quota parte de todas estas utilidades na minha conta. E considero que a uso bem. Não me cansa, não me rouba demasiado tempo, e mantenho-me muitas vezes actualizado através dela, se bem que para isso prefiro o meu Google Reader. Considero-as ferramentas idênticas com objectivos diferentes, no que toca a actualidades.

  • PHP: Um debug mais prático

    Programar PHP

    Hoje apresento-vos uma função que uso para fazer debugs, obviamente um pouco alterada porque, como muitas outras funções que aqui mostro, está integrada numa classe.

    Por defeito, ela só é activada definindo a constante _DEBUG_ para 1, mas também é possível fazer uma simples adaptação para funcionar por “níveis”, ou seja, o output do debug seria diferente para _DEBUG_ 1, 2, 3, etc., funcionando quase como que por importância.

    <?php
    function debug($var,$title='') {
    # Output da variável
    if (defined(_DEBUG_) && _DEBUG_ == 1) {
    # Se for array ou objecto, o output é feito com o título que foi atribuído antes e só depois a formatação.
    if (is_array($var) || is_object($var)) {
    # Imprime o título se este foi definido, de forma visível, ou seja, forçando fundo branco e texto preto.
    if (!empty($title)) echo '<h3 style="font-family: Arial; font-size: 13px; text-align: center; font-weight: bold; color: #000000; background: #FFFFFF; display: block;">»»»»»»»»»»»» '.$title.' ««««««««««««</h3>';

    # Imprime o início do pre, de forma visível, ou seja, forçando fundo branco e texto preto.
    echo '<pre style="font-family: Arial; font-size: 11px; text-align: left; color: #000000; background: #FFFFFF; display: block;">';

    # Imprime o array ou objecto
    print_r($var);

    # Fecha a tag
    echo '</pre>';
    }
    # É um texto, inteiro, etc, como tal, mostramos só numa linha
    else {
    # Mostramos de forma visível a variável, precedida pelo título caso este tenha sido definido.
    echo '<h3 style="font-family: Arial; font-size: 13px; text-align: center; font-weight: bold; color: #000000; background: #FFFFFF; display: block;">»»»»»»»»»»»» '.(!empty($title)?$title.' --- ':'').$var.' ««««««««««««</h3>';
    }
    }
    }
    ?>

    Modo de utilização:

    Como sempre, é bastante simples e intuitivo, segue um exemplo de como fazer output de um array com o título "array definido".

    <?php
    define('_DEBUG_',1);
    $array = array(array(1,2,3),2,3);
    debug($array,'array definido');
    ?>

    Como sempre, é bastante simples e prático, sendo que serve apenas para simplificar o trabalho de quando uma pessoa quer fazer debug tem de fazer um echo, depois tem de adicionar um <br> para ser perceptível, depois um <pre> no caso de um array ou objecto, depois se o fundo for branco não se lê, etc. etc. :)

  • http://www.flickr.com/photos/enz1m3/4184976888/ Rui Veloso - Boelhe
    10 months on
    Feed
  • http://www.flickr.com/photos/enz1m3/4184973906/ Rui Veloso - Boelhe
    10 months on
    Feed
  • http://www.flickr.com/photos/enz1m3/4184971304/ Rui Veloso - Boelhe
    10 months on
    Feed
  • http://www.flickr.com/photos/enz1m3/4184842074/ Sintra, Queda d'água
    12 months on
    Feed
  • http://www.flickr.com/photos/enz1m3/4184839538/ Sintra, Palácio da Pena
    12 months on
    Feed
Next page