Singleton Pattern no PHP 4

Tags: , — September 11, 2008 @ 12:39 am

Já sabemos como funciona o singleton pattern no PHP 5, mas devido as capacidades limitadas de POO do PHP4, não é possível se utilizar do mesmo padrão de desenvolvimento neste, mas há um pequeno truque que podemos fazer para obter o mesmo resultado.

No PHP4 não é possível termos propriedades estáticas em classes, mas ainda é possível ter variáveis estáticas dentro de funções. Assim podemos criar uma função capaz de fazer o papel do singleton ao instanciar uma classe em um objeto estático. Veja o Exemplo:

function &singleton() {
    static $obj;
 
    if (!isset($obj)) {
        //instancia a classe, caso o objeto já não exista
        $obj = new stdclass;
    }
    return $obj;
}

No exemplo, eu usei a classe padrão stdclass do PHP, mas o mesmo funciona com qualquer classe definida pelo usuário. Você pode, inclusive, utilizar um array no lugar da variável $obj para usar a mesma função singleton para instanciar ou recuperar várias classes.

Note o operador de referência ‘&’ antes do nome da função. Ele é necessário para garantir que a função sempre retorne uma referência para o objeto estático, ao invés de criar um novo objeto, e também é necessário ao se atribuir o retorno da função a uma variável . Veja um exemplo de uso da função:

$foo =& singleton(); //cria um objeto
var_dump($foo);
 
$foo->property = 'SamuraiDio'; //atribui um valor a uma propriedade
var_dump($foo);
 
$bar =& singleton(); //recupera o objeto existe (não irá criar um novo)
var_dump($bar);

A saída do código acima, será como a seguir:

object(stdClass)(0) {
}
object(stdClass)(1) {
  ["property"]=>
  string(10) "SamuraiDio"
}
object(stdClass)(1) {
  ["property"]=>
  string(10) "SamuraiDio"
}

Note que a terceira chamadas a var_dump() ainda exibe o valor da propriedade, apesar de ser de outra variável. Isso ocorre porque nossa função singleton() não instancia a classe novamente, mas sim apenas retorna uma referência para o objeto já existente. Assim temos um Singleton Pattern functional também para PHP4.

NOTA: Mesmo com a possibilidade de usar Singleton no PHP4 utiizando-se desta técnica, é altamente recomendável atualizar suas instalações para PHP5, beneficiando-se com a maior capacidade e segurança da versão.

Fontes: http://www.weberdev.com/get_example-4014.html, http://br.php.net/manual/pt_BR/language.variables.scope.php#language.variables.scope.static

Se você gostou deste artigo, inscreva-se em meu RSS feed!

LightTPD + PHP5 no Debian (Part 1: mod_fastcgi)

Tags: , , — September 7, 2008 @ 11:17 pm

Já há algum tempo tenho curiosidade de testar outros servidores http como alternativa ao nosso conhecido Apache, e um que sempre me chamou atenção é o LightTPD, com a promessa de ser mais rápido e ter um consumo bem menor de memória e recursos do sistema.

Este fim de semana resolvi finalmente me aventurar e tentar migrar do Apache para o LightTPD. Apesar de ser uma servidor web bem mais simples que o Apache, as diferenças na configuração deste podem ser uma dor de cabeça para quem está acostumado com as do Apache, principalmente em se tratando do mod_rewrite e Virtual Hosts, por isso vou separar a post em quatro partes:

  1. Instalação básica do LightTPD com mod_fastcgi e utilização com PHP5;
  2. Configuração básica de Virtual Hosts, mod_userdir, e mod_evhost, possibilitando configuraçãode virtual hosts por usuários, por exemplo;
  3. Utilização do mod_rewrite em comparação com o Apache, e configuração deste para “urls limpas” com CakePHP Framework (aplicável também para outros Frameworks e CMSs);
  4. Benchmark. Testes de performance do LightTPD em comparação com o Apache.

Começando com a Parte 1, abordada neste post.

Primeiramente instale o lighttpd, e php5-cgi, juntamente com os módulos PHP que desejar (php5-gd, php5-mysql, etc). Diferente do Apache, o Lighttpd não possui um módulo próprio para executar scripts php, assim, estes serão tratados a partir do módulo fastcgi que, na prática, é mais rápido que o apache mod_php, e não interfere em seu modo de uso.

# aptitude install lighttpd php5-cgi

Se o servidor Apache, ou outro servidor web, estiver sendo executado na porta 80, a instalação gerará um erro e ficará incompleta, pois o apt tentará iniciar o LightTPD na porta 80, que já estará sendo utilizada.

A solução para isto é parar momentaneamente o Apache (/etc/init.d/apache2 stop) , instalar o LightTPD, e alterar a sua porta, para só então reinciar o Apache (/etc/init.d/apache2 start).

Para alterar a porta utilizada pelo LightTPD, basta editar o arquivo /etc/lighttpd/lighttpd.conf e descomentar e alterar a porta, mais ou menos na linha 70: server.port = 81.

Se você não parou o servidor Apache e recebeu um erro na instalação, basta alterar a porta do lightTPD como mostrado acima, e reiniciar a instalação (basta rodar o aptitude install novamente) .

LightTPD Placeholder pageApós concluída a instalação, você deverá ver a página teste do LightTPD acessando http://127.0.0.1/ (ou http://localhost/)  no seu navegador, agora só falta ativar o suporte para PHP5.

Assim como para o Apache, a instalação padrão do LightTPD no Debian coloca as configurações do servidor web em arquivos separados. O arquivo de configuração principal do LightTPD, como já vimos, fica em /etc/lighttpd/lighttpd.conf. Configurações adicionais ficam em /etc/lighttpd/conf-available, e devem sercriados links simbólicos para estes em /etc/lighttpd/conf-enabled para que estes sejam carregados. Assim, vamos habilitar o módulo fastcgi:

# cd /etc/lighttpd/conf-enabled
# ln -s ../conf-available/10-fastcgi.conf .
#

Depois disto edite o arquivo /etc/php5/cgi/php.ini procure e altere a diretiva cgi.fix_pathinfo (linha 533, mais ou menos) de 0 para 1. Esta é uma configuração auxiliar paradar suporte as variávels PATH_INFO e PATH_TRANSLATED, que originalmente não estão disponíveis para o PHP em modo CGI (alteração necessária para alguns Frameworks, como o CakePHP, funcionarem).

Após isto basta reiniciar o LightTPD (/etc/init.d/lighttpd restart) e começar a rodar seus scripts PHP normalmente, aproveitando  o ganho de performance e a economia de memória.

Se você gostou deste artigo, inscreva-se em meu RSS feed!

Comandos engraçados no Debian

Tags: , , , — August 29, 2008 @ 10:30 am

Estava me lembrando hoje de alguns comandos engraçados para o apt-get e aptitude que havia visto a algum tempo na net, e passei um tempo procurando por eles. Sabe-se lá o porque desses comandos estarem no programa, provavelmente apenas como uma pequena piada dos programadores.

Estou postando o comando com o aptitude, primeiramente, e as respostas no terminal. Aumentando a verbose (-v,-vv, […]) a saída muda:

$ aptitude moo
Não existem Ovos de Páscoa neste programa.
$ aptitude -v moo
Realmente não existem Ovos de Páscoa neste programa.
$ aptitude -vv moo
Eu já não lhe disse que não existem Ovos de Páscoa neste programa?
$ aptitude -vvv moo
Pare com isso!
$ aptitude -vvvv moo
Ok, ok, se eu lhe der um Ovo de Páscoa você irá embora?
$ aptitude -vvvvv moo
Tudo bem, você ganhou.

                               /----\
                       -------/      \
                      /               \
                     /                |
   -----------------/                  --------\
   ----------------------------------------------
$ aptitude -vvvvvv moo
O que é isso? Isso é um elefante sendo comido por uma cobra,
é claro.

Com o apt-get nós recebemos a vaquinha :P

$ apt-get moo
         (__)
         (oo)
   /------\/
  / |    ||
 *  /\---/\
    ~~   ~~
...."Have you mooed today?"...

Também, se falarmos ‘moo’ para o bot no canal #Debian no IRC (irc.freenode.net ou irc.debian.org) ele no responde com um versinho:

samuraidio: moo
dpkg: mooooooo! I am cow, hear me moo, I weigh twice as much as you. I’m a cow, eating grass, methane gas comes out my ass. I’m a cow, you could be too; join us all! type apt-get moo. aplay /usr/lib/openoffice/share/gallery/sounds/cow.wav

Apesar de inúteis, estes comandos são, no mínimo, engraçados. É o tipo de coisa que os programadores fazem nas horas vagas…

Eles me lembram também de um comando no M$ Word, onde, se você digitar =rand (20,10) e pressionar Enter ele imprime diversas vezes (pra ser exato, o primeiro número é a quantidade de frases por parágrafo e o segundo a de parágrafos) a seguinte frase:

“A ligeira raposa marrom ataca o cão preguiçoso.”

Porém esta tem uma razão, a frase acima, no original, em inglês, contém todas as letras do alfabeto, é era utilizada para testar máquinas de escrever (Fonte: Wikipédia).

“The quick brown fox jumps over the lazy dog.”

Agora, sabe-se lá porque foi adicionado no M$ Word

Se você gostou deste artigo, inscreva-se em meu RSS feed!

TuxGuitar 1.0 com FluidSynth Plugin

Tags: , , — August 23, 2008 @ 11:37 pm

TuxGuitar 1.0A quase um ano atrás estive falando sobre o TuxGuitar aqui no blog. O programinha trata-se de uma ótima alternativa livre ao Guitar Pro e não deixa nada a desejar.

Após este tempo, o TuxGuitar, agora já na versão 1.0, está disponível nos repositórios do Debian Lenny, juntamente com os plugins Alsa e FluidSynth, o que significa que todo aquele trabalho para fazer funcionar sons Midino Debian não é mais necessário.

O FluidSynth é um sintetizador midi baseado nas especificações SoundFount 2.

Primeiramente você precisará instalar o programa, juntamente com seu plugins alsa e fluidsynth:

# aptitude install \
tuxguitar \
tuxguitar-alsa \
tuxguitar-fluidsynth \
fluidsynth

Para começar a utilizar o TuxGuitar, você precisará também dos kits de instrumentos SoundFonts, que são geralmente encontrados como arquivos com a extensão *.sf2. O website sf2midi.com é uma boa fonte de SoundFonts, dos quais posso recomendar 8MBGMSFX para quem quiser testar rapidamente o TuxGuitar, ou que tiver um computador pouco generoso em memória e processamento. O 8MBGMSFX é um pacote básico de instrumentos, com pouco menos de 8MB, mas que deve servir para a maioria, outros SoundFonts bem mais completos podem ser encontrados no mesmo website ou em outros, e não custa nada testar qual que mais lhe agrada ou pesquisar em alguns fóruns sobre o assunto.

Após baixar o SoundFont, descompacte ele, caso necessário, e verifique a extensão. Se o arquivo estiver com a extensão *.sf2 sem problemas, mas caso esteja com a extensão *.sfArk algum trabalho extra será necessário.

sfArk é um método de compressão comum que alguns compositores utilizam para compactar seus SounFonts. Por sorte a companhia por tráz dele tem uma versão Linux do aplicativo de descompressão, faça o download deste a partir do website http://melodymachine.com/sfark.htm. Para utilizá-lo basta executar: $ sfarkxtc ./thenameofthefilehere.sfArk e o arquivo deve ser descompactado em um *.sf2 (obs. se ao invés de descompactar um *.sf2, descompactar um *.exe ou qualquer outra coisa, procure outro SoundFont).

Com o SoundFont escolhido e salvo, abra seu TuxGuitar, vá em Ferramentas -> Plugins, selecione FluidSynth output plugin e clique em Configurar e depois em Adicionar, então selecione o arquivo *.sf2 que vc baixou e descompactou.

Depois disse vá em Ferramentas -> Configurações -> Som e em Midi Port selecione TG FluidSynth [nome do seu SondFont] .

Adicionando o SoundFont ao plugin FluidSynth  Selecionando o SoundFound como saída de som

Após terminar as configurações, basta clicar em Ok e aplicar as configurações e começar a utilizar o TuxGuitar.

Boas Composições…

Se você gostou deste artigo, inscreva-se em meu RSS feed!

Usando sSMTP com GMail para enviar emails no Debian

Tags: , — August 13, 2008 @ 6:48 pm

Exim4 é, por padrão o MTA (Mail Transfer Agent, ou agente de transporte de e-mail) do Debian, porém, este costuma ser demasiado grande, pesado, e desnecessário, caso não esteja sendo utilizado em um servidor de e-mails. Como alternativa, caso seja necessário apenas o envio de e-mails ocasionais, e não recebimento, na máquina em questão, pode-se utilizar um MTA simples e leve, que utilize um hub externo (um servidor smtp) para o envio de emails, como o sSMTP.

Diferente de um MTA completo como o Exim4, postfix ou sendmail, o sSMTP apenas encaminha os emails a serem enviados pelo PC para um hub externo, assim você pode utilizar seu servidor de emails preferido como gmail, yahoo, ou qualquer outro, para enviar seus emails de seu PC.

Embora para alguns pode ser extremamente desnecessário ter um serviço MTA sendo executado no computador, note que este é utilizado para enviar emails implicita ou explicitamente pelo sistema. Um bom exemplo é o envio de notificações de bugs que a maioria das distribuições possui, ou o “Concurso de Popularidade” do Debian, que envia (caso o usuário tenha concordado com o serviço, durante a instalação do sistema) semanalmente informações sobre os pacotes instalados e programas mais utilizados aos desenvolvedores. De qualquer modo, vale a pena instalar e configurar o sSMTP por duas razões, por ser mais leve que o Exim4, e para enviar e-mails a partir do sistema quando necessário.

Primeiramente instale-o via  aptitude:

# aptitude install ssmtp

Note que serão removidos o Exim4 e suas dependencias.

Após a instalação concluída, basta editar o arquivo de configuração em /etc/ssmtp/ssmtp.conf. A seguir tem um exemplo do arquivo a ser gerado, com a configuração correta para enviar por uma conta do gmail:

# Config file for sSMTP sendmail
#
# The person who gets all mail for userids < 1000
# Make this empty to disable rewriting.
root=postmaster
 
# The place where the mail goes.
# The actual machine name is required no
# MX records are consulted.
# Commonly mailhosts are named mail.domain.com
 
# GMAIL configuration
mailhub=smtp.gmail.com:587
AuthUser=seuemail@gmail.com
AuthPass=senha
UseSTARTTLS=YES
 
# The full hostname
#hostname=machinehostname
 
# Are users allowed to set their own From: address?
# YES - Allow the user to specify their own From: address
# NO - Use the system generated From: address
FromLineOverride=YES

Para outros servidores de email pode não ser necessária a opção UseSTARTTLS, utilizada para autenticações SSL, ou mesmo as AuthUser e AuthPass, caso o servidor smtp não exija autenticação.

Após configura o arquivo os e-mails já poderão ser enviados normalmente a partir da máquina. Você pode testar com:

$ mail seuemail@seudominio.com

Fonte: http://www.igvita.com/2007/08/29/ssmtp-relay-mail-delivery-in-rails/

Se você gostou deste artigo, inscreva-se em meu RSS feed!

Cake Bake no Eclipse

Tags: , — August 12, 2008 @ 4:56 pm

O Eclipse é sem dúvida uma IDE completa e multiuso. Com um pouco de dedicação podemos adicionar plugins para qualquer funcionalidade que precisemos.

Nas próximas linhas vou mostrar como configurar de forma rápida e fácil o Cake Bake para ser utilizado a partir do Eclipse, agilizando muito os projetos de quem trabala com CakePHP.

Para quem não sabe, o Cake Bake é um script utilizado para criar automaticamente a estrutura básica das aplicações para o CakePHP, incluindo controllers com os métodos mais utilizados (index, view, add, edit, delete), models e configuração com a base de dados, e encontra-se no diretório cake/console (shell script cake, ou cake.bat para Win/DOS).

Para utilizá-lo a partir do Eclipse, vá em Run -> External Tool -> Open External Tool Dialog, dê dois cliques em Program e coloque em Location o caminho completo para o script executável cake. Coloque ${resource_loc} em Working Directory (esta variável corresponde a pasta ou arquivo selecionado no Navegador do Eclipse) e bake em Arguments:

eclipse_and_bake1.jpg

Após isto basta selecionar o seu projeto onde deseja executar o Cake Bake, eclicar em Run -> External Tool -> [nome que vc colocou], ou no botão External Tools na barra de ferramentas, e utilizar o Cake Bake normalmente pelo console do Eclipse.

eclipse_and_bake2.jpg

 

eclipse_and_bake3.jpg

Se você gostou deste artigo, inscreva-se em meu RSS feed!

<<< Previous Page - Next Page >>>